From 0d91c5360dd942aed5c5ddb7c52df0fd041969a1 Mon Sep 17 00:00:00 2001 From: Thiakil Date: Sun, 2 Oct 2016 14:19:46 +0800 Subject: [PATCH 01/37] Port getAllStacks from Inventory driver --- .../traits/WorldInventoryAnalytics.scala | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala b/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala index 66c78847d..5e3ee07e7 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala @@ -76,6 +76,22 @@ trait WorldInventoryAnalytics extends WorldAware with SideRestricted with Networ } else result(Unit, "not enabled in config") + @Callback(doc = """function(side:number):table -- Get a description of all stacks in the inventory on the specified side of the device.""") + def getAllStacks(context: Context, args: Arguments): Array[AnyRef] = if (Settings.get.allowItemStackInspection) { + val facing = checkSideForAction(args, 0) + withInventory(facing, inventory => { + var stacks = new Array[AnyRef](inventory.getSizeInventory) + for(i <- 0 to inventory.getSizeInventory - 1){ + stacks(i) = inventory.getStackInSlot(i) + if (stacks(i) == null) { + stacks(i) = scala.collection.mutable.Map.empty[AnyRef, AnyRef] + } + } + result(stacks) + }) + } + else result(Unit, "not enabled in config") + @Callback(doc = """function(side:number, slot:number, dbAddress:string, dbSlot:number):boolean -- Store an item stack description in the specified slot of the database with the specified address.""") def store(context: Context, args: Arguments): Array[AnyRef] = { val facing = checkSideForAction(args, 0) From 37363127e8ed72499682651d44903cab77b036b8 Mon Sep 17 00:00:00 2001 From: Thiakil Date: Sun, 2 Oct 2016 14:23:15 +0800 Subject: [PATCH 02/37] Port getInventoryName from inventory driver --- .../server/component/traits/WorldInventoryAnalytics.scala | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala b/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala index 5e3ee07e7..73fdc6a9f 100644 --- a/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala +++ b/src/main/scala/li/cil/oc/server/component/traits/WorldInventoryAnalytics.scala @@ -92,6 +92,12 @@ trait WorldInventoryAnalytics extends WorldAware with SideRestricted with Networ } else result(Unit, "not enabled in config") + @Callback(doc = """function(side:number):string -- Get the the name of the inventory on the specified side of the device.""") + def getInventoryName(context: Context, args: Arguments): Array[AnyRef] = { + val facing = checkSideForAction(args, 0) + withInventory(facing, inventory => result(inventory.getName())) + } + @Callback(doc = """function(side:number, slot:number, dbAddress:string, dbSlot:number):boolean -- Store an item stack description in the specified slot of the database with the specified address.""") def store(context: Context, args: Arguments): Array[AnyRef] = { val facing = checkSideForAction(args, 0) From 1273968142e3614457c6c2a0e5649e9da43cabe7 Mon Sep 17 00:00:00 2001 From: Xander Date: Wed, 19 Apr 2017 19:18:51 +0800 Subject: [PATCH 03/37] convert to userdata --- .../oc/api/prefab/ItemStackArrayValue.java | 136 ++++++++++++++++++ .../traits/WorldInventoryAnalytics.scala | 32 +++-- 2 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java diff --git a/src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java b/src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java new file mode 100644 index 000000000..f44353527 --- /dev/null +++ b/src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java @@ -0,0 +1,136 @@ +package li.cil.oc.api.prefab; + +import li.cil.oc.api.machine.Arguments; +import li.cil.oc.api.machine.Callback; +import li.cil.oc.api.machine.Context; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTBase; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; + +import java.util.HashMap; +import java.util.TreeMap; + +public class ItemStackArrayValue extends AbstractValue { + + private ItemStack[] array = null; + private int iteratorIndex; + + private static final byte TAGLIST_ID = (new NBTTagList()).getId(); + private static final byte COMPOUND_ID = (new NBTTagCompound()).getId(); + private static final String ARRAY_KEY = "Array"; + private static final String INDEX_KEY = "Index"; + + private static final HashMap emptyMap = new HashMap(); + + public ItemStackArrayValue(ItemStack[] arr){ + if (arr != null){ + this.array = new ItemStack[arr.length]; + for (int i=0; i< arr.length; i++){ + this.array[i] = arr[i] != null ? arr[i].copy() : null; + } + } + this.iteratorIndex = 0; + } + + public ItemStackArrayValue(){ + this(null); + } + + @Override + public Object[] call(Context context, Arguments arguments) { + if (this.array == null) + return null; + if (this.iteratorIndex >= this.array.length) + return null; + int index = this.iteratorIndex++; + if (this.array[index] == null)//TODO 1.11 change to ItemStack.EMPTY? + return new Object[]{ emptyMap }; + return new Object[]{ this.array[index] != null ? this.array[index] : emptyMap }; + } + + @Override + public Object apply(Context context, Arguments arguments) { + if (arguments.count() == 0 || this.array == null) + return null; + if (arguments.isInteger(0)){//index access + int luaIndex = arguments.checkInteger(0); + if (luaIndex > this.array.length || luaIndex < 1){ + return null; + } + return this.array[luaIndex-1]; + } + if (arguments.isString(0)){ + String arg = arguments.checkString(0); + if (arg.equals("n")){ + return this.array.length; + } + } + return null; + } + + @Override + public void load(NBTTagCompound nbt) { + if (nbt.hasKey(ARRAY_KEY, TAGLIST_ID)){ + NBTTagList tagList = nbt.getTagList(ARRAY_KEY,COMPOUND_ID); + this.array = new ItemStack[tagList.tagCount()]; + for (int i = 0; i < tagList.tagCount(); ++i){ + NBTTagCompound el = tagList.getCompoundTagAt(i); + if (el.hasNoTags()) + this.array[i] = null;//TODO 1.11 change to ItemStack.EMPTY? + else + this.array[i] = ItemStack.loadItemStackFromNBT(el); + } + } else { + this.array = null; + } + this.iteratorIndex = nbt.getInteger(INDEX_KEY); + } + + @Override + public void save(NBTTagCompound nbt) { + + NBTTagCompound nullnbt = new NBTTagCompound(); + + if (this.array != null) { + NBTTagList nbttaglist = new NBTTagList(); + for (ItemStack stack : this.array) { + if (stack != null) { + NBTBase nbttagcompound = stack.serializeNBT(); + nbttaglist.appendTag(nbttagcompound); + } else { + nbttaglist.appendTag(nullnbt); + } + } + + nbt.setTag(ARRAY_KEY, nbttaglist); + } + + nbt.setInteger(INDEX_KEY, iteratorIndex); + } + + @Callback(doc="function():nil -- Reset the iterator index so that the next call will return the first element.") + public Object[] reset(Context context, Arguments arguments) throws Exception { + this.iteratorIndex = 0; + return null; + } + + @Callback(doc="function():number -- Returns the number of elements in the this.array.") + public Object[] count(Context context, Arguments arguments) throws Exception { + return new Object[] { this.array != null ? this.array.length : 0 }; + } + + @Callback(doc="function():table -- Returns ALL the stack in the this.array. Memory intensive.") + public Object[] getAll(Context context, Arguments arguments) throws Exception { + TreeMap map = new TreeMap(); + for (int i=0; i { - var stacks = new Array[AnyRef](inventory.getSizeInventory) - for(i <- 0 to inventory.getSizeInventory - 1){ + val stacks = new Array[ItemStack](inventory.getSlots) + for(i <- 0 until inventory.getSlots){ stacks(i) = inventory.getStackInSlot(i) - if (stacks(i) == null) { - stacks(i) = scala.collection.mutable.Map.empty[AnyRef, AnyRef] - } } - result(stacks) + result(new ItemStackArrayValue(stacks)) }) } else result(Unit, "not enabled in config") @Callback(doc = """function(side:number):string -- Get the the name of the inventory on the specified side of the device.""") - def getInventoryName(context: Context, args: Arguments): Array[AnyRef] = { + def getInventoryName(context: Context, args: Arguments): Array[AnyRef] = if (Settings.get.allowItemStackInspection) { val facing = checkSideForAction(args, 0) - withInventory(facing, inventory => result(inventory.getName())) + def blockAt(position: BlockPosition): Option[Block] = position.world match { + case Some(world) if world.blockExists(position) => world.getBlock(position) match { + case block: Block => Some(block) + case _ => None + } + case _ => None + } + withInventory(facing, inventory => blockAt(position.offset(facing)) match { + case Some(block) => result(block.getRegistryName) + case _ => result(Unit, "Unknown") + }) } + else result(Unit, "not enabled in config") @Callback(doc = """function(side:number, slot:number, dbAddress:string, dbSlot:number):boolean -- Store an item stack description in the specified slot of the database with the specified address.""") def store(context: Context, args: Arguments): Array[AnyRef] = { From dd084247bea1abaa9819853966a76f45ddd1bdee Mon Sep 17 00:00:00 2001 From: Xander Date: Sat, 22 Apr 2017 10:21:57 +0800 Subject: [PATCH 04/37] Pass Value objects through Registry.convert before back to Lua --- .../scala/li/cil/oc/server/machine/luac/UserdataAPI.scala | 5 +++-- .../scala/li/cil/oc/server/machine/luaj/UserdataAPI.scala | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/machine/luac/UserdataAPI.scala b/src/main/scala/li/cil/oc/server/machine/luac/UserdataAPI.scala index 168a19da1..3d24fe65e 100644 --- a/src/main/scala/li/cil/oc/server/machine/luac/UserdataAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luac/UserdataAPI.scala @@ -8,6 +8,7 @@ import java.io.DataOutputStream import li.cil.oc.OpenComputers import li.cil.oc.api.Persistable import li.cil.oc.api.machine.Value +import li.cil.oc.server.driver.Registry import li.cil.oc.server.machine.ArgumentsImpl import li.cil.oc.util.ExtendedLuaState.extendLuaState import net.minecraft.nbt.CompressedStreamTools @@ -56,7 +57,7 @@ class UserdataAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) { lua.pushScalaFunction(lua => { val value = lua.toJavaObjectRaw(1).asInstanceOf[Value] val args = lua.toSimpleJavaObjects(2) - owner.invoke(() => Array(value.apply(machine, new ArgumentsImpl(args)))) + owner.invoke(() => Registry.convert(Array(value.apply(machine, new ArgumentsImpl(args))))) }) lua.setField(-2, "apply") @@ -73,7 +74,7 @@ class UserdataAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) { lua.pushScalaFunction(lua => { val value = lua.toJavaObjectRaw(1).asInstanceOf[Value] val args = lua.toSimpleJavaObjects(2) - owner.invoke(() => value.call(machine, new ArgumentsImpl(args))) + owner.invoke(() => Registry.convert(value.call(machine, new ArgumentsImpl(args)))) }) lua.setField(-2, "call") diff --git a/src/main/scala/li/cil/oc/server/machine/luaj/UserdataAPI.scala b/src/main/scala/li/cil/oc/server/machine/luaj/UserdataAPI.scala index 6ada183b2..336fc4eea 100644 --- a/src/main/scala/li/cil/oc/server/machine/luaj/UserdataAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luaj/UserdataAPI.scala @@ -2,6 +2,7 @@ package li.cil.oc.server.machine.luaj import li.cil.oc.OpenComputers import li.cil.oc.api.machine.Value +import li.cil.oc.server.driver.Registry import li.cil.oc.server.machine.ArgumentsImpl import li.cil.oc.util.ScalaClosure._ import li.cil.repack.org.luaj.vm2.LuaValue @@ -16,7 +17,7 @@ class UserdataAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) { userdata.set("apply", (args: Varargs) => { val value = args.checkuserdata(1, classOf[Value]).asInstanceOf[Value] val params = toSimpleJavaObjects(args, 2) - owner.invoke(() => Array(value.apply(machine, new ArgumentsImpl(params)))) + owner.invoke(() => Registry.convert(Array(value.apply(machine, new ArgumentsImpl(params))))) }) userdata.set("unapply", (args: Varargs) => { @@ -31,7 +32,7 @@ class UserdataAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) { userdata.set("call", (args: Varargs) => { val value = args.checkuserdata(1, classOf[Value]).asInstanceOf[Value] val params = toSimpleJavaObjects(args, 2) - owner.invoke(() => value.call(machine, new ArgumentsImpl(params))) + owner.invoke(() => Registry.convert(value.call(machine, new ArgumentsImpl(params)))) }) userdata.set("dispose", (args: Varargs) => { From 7c3e3663cb0525d088136e550aaa68a69eeb20ad Mon Sep 17 00:00:00 2001 From: 45210 <452104285@qq.com> Date: Wed, 24 May 2017 14:26:51 +0800 Subject: [PATCH 05/37] Adding zh_CN localization of OpenComputers Manual,and fix of infinite loop in calculating nextY --- gradle.properties | 0 .../opencomputers/doc/zh_CN/block/_robot.md | 11 +++ .../doc/zh_CN/block/accessPoint.md | 13 +++ .../opencomputers/doc/zh_CN/block/adapter.md | 8 ++ .../doc/zh_CN/block/assembler.md | 23 +++++ .../opencomputers/doc/zh_CN/block/cable.md | 10 ++ .../doc/zh_CN/block/capacitor.md | 13 +++ .../opencomputers/doc/zh_CN/block/case1.md | 35 +++++++ .../opencomputers/doc/zh_CN/block/case2.md | 1 + .../opencomputers/doc/zh_CN/block/case3.md | 1 + .../doc/zh_CN/block/caseCreative.md | 1 + .../doc/zh_CN/block/chameliumBlock.md | 8 ++ .../opencomputers/doc/zh_CN/block/charger.md | 13 +++ .../doc/zh_CN/block/disassembler.md | 7 ++ .../doc/zh_CN/block/diskDrive.md | 15 +++ .../opencomputers/doc/zh_CN/block/geolyzer.md | 5 + .../doc/zh_CN/block/hologram1.md | 11 +++ .../doc/zh_CN/block/hologram2.md | 1 + .../opencomputers/doc/zh_CN/block/index.md | 48 +++++++++ .../opencomputers/doc/zh_CN/block/keyboard.md | 5 + .../doc/zh_CN/block/microcontroller.md | 8 ++ .../doc/zh_CN/block/motionSensor.md | 7 ++ .../doc/zh_CN/block/netSplitter.md | 9 ++ .../doc/zh_CN/block/powerConverter.md | 8 ++ .../doc/zh_CN/block/powerDistributor.md | 6 ++ .../opencomputers/doc/zh_CN/block/print.md | 11 +++ .../opencomputers/doc/zh_CN/block/printer.md | 18 ++++ .../opencomputers/doc/zh_CN/block/rack.md | 6 ++ .../opencomputers/doc/zh_CN/block/raid.md | 15 +++ .../opencomputers/doc/zh_CN/block/redstone.md | 12 +++ .../opencomputers/doc/zh_CN/block/relay.md | 17 ++++ .../opencomputers/doc/zh_CN/block/robot.md | 9 ++ .../opencomputers/doc/zh_CN/block/screen1.md | 12 +++ .../opencomputers/doc/zh_CN/block/screen2.md | 1 + .../opencomputers/doc/zh_CN/block/screen3.md | 1 + .../opencomputers/doc/zh_CN/block/switch.md | 13 +++ .../doc/zh_CN/block/transposer.md | 9 ++ .../opencomputers/doc/zh_CN/block/waypoint.md | 6 ++ .../doc/zh_CN/general/computer.md | 9 ++ .../doc/zh_CN/general/example.md | 69 +++++++++++++ .../opencomputers/doc/zh_CN/general/lua.md | 15 +++ .../opencomputers/doc/zh_CN/general/openOS.md | 11 +++ .../doc/zh_CN/general/quickstart.md | 59 +++++++++++ .../assets/opencomputers/doc/zh_CN/index.md | 47 +++++++++ .../doc/zh_CN/item/abstractBusCard.md | 5 + .../opencomputers/doc/zh_CN/item/acid.md | 9 ++ .../opencomputers/doc/zh_CN/item/alu.md | 5 + .../opencomputers/doc/zh_CN/item/analyzer.md | 7 ++ .../doc/zh_CN/item/angelUpgrade.md | 5 + .../opencomputers/doc/zh_CN/item/apu1.md | 5 + .../opencomputers/doc/zh_CN/item/apu2.md | 1 + .../opencomputers/doc/zh_CN/item/arrowKeys.md | 5 + .../doc/zh_CN/item/batteryUpgrade1.md | 5 + .../doc/zh_CN/item/batteryUpgrade2.md | 1 + .../doc/zh_CN/item/batteryUpgrade3.md | 1 + .../doc/zh_CN/item/buttonGroup.md | 4 + .../opencomputers/doc/zh_CN/item/card.md | 5 + .../doc/zh_CN/item/cardContainer1.md | 5 + .../doc/zh_CN/item/cardContainer2.md | 1 + .../doc/zh_CN/item/cardContainer3.md | 1 + .../opencomputers/doc/zh_CN/item/chamelium.md | 9 ++ .../opencomputers/doc/zh_CN/item/chip1.md | 5 + .../opencomputers/doc/zh_CN/item/chip2.md | 1 + .../opencomputers/doc/zh_CN/item/chip3.md | 1 + .../doc/zh_CN/item/chunkloaderUpgrade.md | 7 ++ .../doc/zh_CN/item/circuitBoard.md | 5 + .../doc/zh_CN/item/componentBus1.md | 10 ++ .../doc/zh_CN/item/componentBus2.md | 1 + .../doc/zh_CN/item/componentBus3.md | 1 + .../doc/zh_CN/item/controlUnit.md | 5 + .../opencomputers/doc/zh_CN/item/cpu1.md | 14 +++ .../opencomputers/doc/zh_CN/item/cpu2.md | 1 + .../opencomputers/doc/zh_CN/item/cpu3.md | 1 + .../doc/zh_CN/item/craftingUpgrade.md | 5 + .../doc/zh_CN/item/cuttingWire.md | 5 + .../opencomputers/doc/zh_CN/item/dataCard1.md | 7 ++ .../opencomputers/doc/zh_CN/item/dataCard2.md | 1 + .../opencomputers/doc/zh_CN/item/dataCard3.md | 1 + .../doc/zh_CN/item/databaseUpgrade1.md | 10 ++ .../doc/zh_CN/item/databaseUpgrade2.md | 1 + .../doc/zh_CN/item/databaseUpgrade3.md | 1 + .../opencomputers/doc/zh_CN/item/debugCard.md | 9 ++ .../opencomputers/doc/zh_CN/item/disk.md | 5 + .../doc/zh_CN/item/diskDriveMountable.md | 5 + .../opencomputers/doc/zh_CN/item/drone.md | 5 + .../doc/zh_CN/item/droneCase1.md | 33 +++++++ .../doc/zh_CN/item/droneCase2.md | 1 + .../doc/zh_CN/item/droneCaseCreative.md | 1 + .../opencomputers/doc/zh_CN/item/eeprom.md | 6 ++ .../doc/zh_CN/item/experienceUpgrade.md | 9 ++ .../opencomputers/doc/zh_CN/item/floppy.md | 5 + .../doc/zh_CN/item/generatorUpgrade.md | 10 ++ .../doc/zh_CN/item/graphicsCard1.md | 5 + .../doc/zh_CN/item/graphicsCard2.md | 1 + .../doc/zh_CN/item/graphicsCard3.md | 1 + .../opencomputers/doc/zh_CN/item/hdd1.md | 5 + .../opencomputers/doc/zh_CN/item/hdd2.md | 1 + .../opencomputers/doc/zh_CN/item/hdd3.md | 1 + .../doc/zh_CN/item/hoverBoots.md | 9 ++ .../doc/zh_CN/item/hoverUpgrade1.md | 16 +++ .../doc/zh_CN/item/hoverUpgrade2.md | 1 + .../opencomputers/doc/zh_CN/item/index.md | 97 +++++++++++++++++++ .../doc/zh_CN/item/inkCartridge.md | 5 + .../doc/zh_CN/item/inkCartridgeEmpty.md | 1 + .../doc/zh_CN/item/internetCard.md | 7 ++ .../opencomputers/doc/zh_CN/item/interweb.md | 5 + .../zh_CN/item/inventoryControllerUpgrade.md | 9 ++ .../doc/zh_CN/item/inventoryUpgrade.md | 7 ++ .../opencomputers/doc/zh_CN/item/lanCard.md | 5 + .../doc/zh_CN/item/leashUpgrade.md | 5 + .../doc/zh_CN/item/linkedCard.md | 5 + .../opencomputers/doc/zh_CN/item/manual.md | 17 ++++ .../opencomputers/doc/zh_CN/item/mfu.md | 7 ++ .../doc/zh_CN/item/microcontrollerCase1.md | 31 ++++++ .../doc/zh_CN/item/microcontrollerCase2.md | 1 + .../zh_CN/item/microcontrollerCaseCreative.md | 1 + .../doc/zh_CN/item/nanomachines.md | 34 +++++++ .../doc/zh_CN/item/navigationUpgrade.md | 9 ++ .../opencomputers/doc/zh_CN/item/numPad.md | 5 + .../doc/zh_CN/item/pistonUpgrade.md | 7 ++ .../doc/zh_CN/item/printedCircuitBoard.md | 5 + .../opencomputers/doc/zh_CN/item/ram1.md | 17 ++++ .../opencomputers/doc/zh_CN/item/ram2.md | 1 + .../opencomputers/doc/zh_CN/item/ram3.md | 1 + .../opencomputers/doc/zh_CN/item/ram4.md | 1 + .../opencomputers/doc/zh_CN/item/ram5.md | 1 + .../opencomputers/doc/zh_CN/item/ram6.md | 1 + .../doc/zh_CN/item/rawCircuitBoard.md | 5 + .../doc/zh_CN/item/redstoneCard1.md | 9 ++ .../doc/zh_CN/item/redstoneCard2.md | 1 + .../opencomputers/doc/zh_CN/item/server1.md | 39 ++++++++ .../opencomputers/doc/zh_CN/item/server2.md | 1 + .../opencomputers/doc/zh_CN/item/server3.md | 1 + .../doc/zh_CN/item/serverCreative.md | 1 + .../doc/zh_CN/item/signUpgrade.md | 5 + .../doc/zh_CN/item/solarGeneratorUpgrade.md | 5 + .../opencomputers/doc/zh_CN/item/tablet.md | 13 +++ .../doc/zh_CN/item/tabletCase1.md | 39 ++++++++ .../doc/zh_CN/item/tabletCase2.md | 1 + .../doc/zh_CN/item/tabletCaseCreative.md | 1 + .../doc/zh_CN/item/tankControllerUpgrade.md | 9 ++ .../doc/zh_CN/item/tankUpgrade.md | 5 + .../opencomputers/doc/zh_CN/item/terminal.md | 9 ++ .../doc/zh_CN/item/terminalServer.md | 5 + .../doc/zh_CN/item/texturePicker.md | 5 + .../doc/zh_CN/item/tractorBeamUpgrade.md | 5 + .../doc/zh_CN/item/tradingUpgrade.md | 5 + .../doc/zh_CN/item/transistor.md | 5 + .../doc/zh_CN/item/upgradeContainer1.md | 5 + .../doc/zh_CN/item/upgradeContainer2.md | 1 + .../doc/zh_CN/item/upgradeContainer3.md | 1 + .../opencomputers/doc/zh_CN/item/wlanCard.md | 7 ++ .../doc/zh_CN/item/worldSensorCard.md | 5 + .../opencomputers/doc/zh_CN/item/wrench.md | 5 + .../opencomputers/doc/zh_CN/无效文件.txt | 13 +++ .../scala/li/cil/oc/client/gui/Manual.scala | 2 +- .../markdown/segment/BasicTextSegment.scala | 10 +- 157 files changed, 1394 insertions(+), 2 deletions(-) create mode 100644 gradle.properties create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/accessPoint.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/adapter.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/assembler.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/cable.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/capacitor.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/case1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/case2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/case3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/caseCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/chameliumBlock.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/charger.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/disassembler.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/diskDrive.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/geolyzer.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/keyboard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/microcontroller.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/motionSensor.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/netSplitter.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/powerConverter.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/powerDistributor.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/rack.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/raid.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/redstone.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/screen2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/screen3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/transposer.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/general/computer.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/general/example.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/general/lua.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/general/openOS.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/index.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/abstractBusCard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/acid.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/alu.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/analyzer.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/angelUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/apu1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/apu2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/arrowKeys.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/buttonGroup.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/card.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/chamelium.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/chip1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/chip2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/chip3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/chunkloaderUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/circuitBoard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/controlUnit.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/craftingUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/cuttingWire.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/debugCard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/disk.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/diskDriveMountable.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/drone.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCaseCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/eeprom.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/experienceUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/floppy.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/generatorUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridge.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridgeEmpty.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/internetCard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/interweb.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryControllerUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/lanCard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/leashUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/linkedCard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/manual.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCaseCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/nanomachines.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/navigationUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/numPad.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/pistonUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/printedCircuitBoard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/ram1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/ram2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/ram3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/ram4.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/ram5.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/ram6.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/rawCircuitBoard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/server1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/server2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/server3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/serverCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/signUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/solarGeneratorUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCaseCreative.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tankControllerUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tankUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/terminalServer.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/texturePicker.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tractorBeamUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/tradingUpgrade.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/transistor.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer1.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer2.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer3.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/worldSensorCard.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/item/wrench.md create mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..e69de29bb diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md new file mode 100644 index 000000000..32434c842 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/_robot.md @@ -0,0 +1,11 @@ +# Robot +![His name was Tobor.](block:OpenComputers:robot) +和电脑不同 ,机器人可以如同实体那样在地图上移动,但机器人无法和外界组件交互,但!如果要和电脑或者其他机器人通讯,请安装 [无线网卡](../item/wlanCard.md),或者是通过[红石卡](../item/redstoneCard1.md)收发红石信号建立底层的协议 + +把[任意机箱](case1.md)放进[组装机](assembler.md)就可以制作机器人. +高级的机箱由于有更高级的[CPU](../item/cpu1.md),可以制造更复杂的机器人. 机器人的复杂度 (显示在 [组装机](assembler.md)GUI) 由槽内安装的组件和升级决定; +高级组件将会大大增加复杂度. 太复杂的情况下, 组装机会选择罢工 +多种升级可以扩展机器人的能力, 包括 [物品栏升级](../item/inventoryUpgrade.md) , [物品栏控制升级](../item/inventoryControllerUpgrade.md) , [储罐升级](../item/tankUpgrade.md), +[导航升级](../item/navigationUpgrade.md)等等. [升级](../item/upgradeContainer1.md) 和 [卡](../item/cardContainer1.md) 可以被热插拔哦 +[软驱](diskDrive.md) 可以被作为机器人的组件,允许插入[软盘](../item/floppy.md)来安装openOS,当然你可以在组装的时候就丢一块安好系统的硬盘进去。 + \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/accessPoint.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/accessPoint.md new file mode 100644 index 000000000..20589481a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/accessPoint.md @@ -0,0 +1,13 @@ +# 接入点 + +![AAA](oredict:oc:accessPoint) + +*本方块是过时的,将会在未来版本被移除 请换用 [中继器](relay.md) 避免丢失 + +The access point is the wireless version of the [switch](switch.md). It can be used to separate subnetworks so that machines in them will not see [components](../general/computer.md) in other networks, while still allowing to send network messages to the machines in other networks. + +In addition to that, this block can act as a repeater: it can re-send wired messages as wired messages to other devices; or wireless messages as wired or wireless messages. + +[Switches](switch.md) and access point 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, packet loss can occur when trying to send network messages too frequently. You can upgrade your switches and access points to increase the speed at which they relay messages, as well as their internal message queue size. + +Packets are only re-sent a certain number of times, so chaining an arbitrary number of [switches](switch.md) or access points is not possible. By default, a packet will be re-sent up to five times. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/adapter.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/adapter.md new file mode 100644 index 000000000..a7ed7dd91 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/adapter.md @@ -0,0 +1,8 @@ +# 适配器 + +![Now with 100% more everything.](oredict:oc:adapter) + +允许 [电脑](../general/computer.md) 与原版和其他mod的方块交互. 相邻的支持方块将会在连接适配器的 [电脑](../general/computer.md) 显示 + +适配器还有多种选择器升级.比如, the [物品控制器升级](../item/inventoryControllerUpgrade.md) 允许电脑从相邻适配器的方块中获取更详细的物品信息, 就像这个升级呗安装在设备里面一样 (比如[机器人](robot.md) or [无人机](../item/drone.md)), and a [储罐控制器升级](../item/tankControllerUpgrade.md) provides similar functionality for fluid tanks next to the adapter. +你还可以安装[MFU](../item/mfu.md) 来与更远的方块交互 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/assembler.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/assembler.md new file mode 100644 index 000000000..4ee32ca0f --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/assembler.md @@ -0,0 +1,23 @@ +# 组装器 + +![Harder, better, faster, stronger.](oredict:oc:assembler) + +组装器用来制作更加复杂的物品, 如 [机器人](robot.md), [无人机](../item/drone.md) 和 [平板](../item/tablet.md). 需要大量能源来组装设备, 推荐使用[电容版](capacitor.md)供电. + +将设备零件放入组装器来组装物品. 对于 [机器人](robot.md),需要 任意[机箱](case1.md) ; 对于[平板](../item/tablet.md), 需要[平板外壳](../item/tabletCase1.md). 像大多数OC物品栏那样, 部件可以被放入任意几个栏; 在物品栏悬停可以指示你有什么东西可以放进去. 有NEI的话,NEI也能显示合适的物品. 添加你希望成品能包含的配件. + +尤其注意你的操作系统, 或者你也可以选择一会再装(你可以为机器人安装[磁盘驱动器](diskDrive.md) 来使用 [软盘](../item/floppy.md) l). 对大多数设备来说 [E2PROM](../item/eeprom.md) 可以被再编程, + +插入不同的 [E2PROM](../item/eeprom.md) 后. 已有的 [E2PROM](../item/eeprom.md)会归还到物品栏 + +注意[机器人](robot.md) 也可以有 [屏幕](screen1.md), 你可以安装一个[屏幕 (1级)](screen1.md),这样可以敲入命令, + +也可以安放 [键盘](keyboard.md). 对于 [平板](../item/tablet.md), [屏幕](screen1.md)在[平板外壳](../item/tabletCase1.md)预装了, + +但是你还是要安一个 [键盘](keyboard.md) + +一切就位后,按下开始,设备会被组装,充能。记住,一旦组装就无法更改了,除非[拆解](disassembler.md)。 + +复杂度: 物品的级别决定了复杂度要求, 一级物品要求2复杂度,二级2,以此类推,箱子升级例外 + +此时复杂度为2倍箱子 (eg: a tier 2 [upgrade containers](../item/upgradeContainer1.md) requires 4 complexity, and likewise for [card containers](../item/cardContainer1.md)). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/cable.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/cable.md new file mode 100644 index 000000000..94f4ccf22 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/cable.md @@ -0,0 +1,10 @@ +# 线缆 + +![Salad.](oredict:oc:cable) + +连接[电脑](../general/computer.md) 和机器, + +可以被任意染料染色,之后只和同色或缺省的灰色连接 + +可以有效防止乱走线 + diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/capacitor.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/capacitor.md new file mode 100644 index 000000000..0b49ec111 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/capacitor.md @@ -0,0 +1,13 @@ +# 电容 + +![It's over 9000.](oredict:oc:capacitor) + +存储了网络需要的能源, 作为能源缓存.不像那种把其他能源转换过来的mod ([能源转换器](powerConverter.md)), + +这个能源转化是即时的. 内部缓存对一些有大量需求的任务比较有用, 比如[组装](assembler.md) 或者 [充能](charger.md) 设备 如[机器人](robot.md) , [无人机](../item/drone.md). + +存储效率和附近的电容总数有关. 比如两个相邻的电容总是比分开的两个存的多. + +相邻的判定是2个方块距离, 然后效率随着距离递减. + +可以链接[能源分发器](powerDistributor.md)为网络上的设备供能。 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/case1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/case1.md new file mode 100644 index 000000000..9b58a8a11 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/case1.md @@ -0,0 +1,35 @@ +# 机箱 + +![Just in case.](oredict:oc:case1) + +机箱有数个型号,越大的型号能放的配件越多 + +T1的可放配件: +- 2X T1扩展卡 (如[显卡](../item/graphicsCard1.md), [网卡](../item/lanCard.md)) +- 1x T1 [CPU](../item/cpu1.md) +- 2x T1 [内存](../item/ram1.md) +- 1x T1 [硬盘](../item/hdd1.md) + +T2的可放配件: +- 1x T1扩展卡 (如[显卡](../item/graphicsCard1.md), [网卡](../item/lanCard.md)) +- 1x T2 扩展卡 +- 1x T2 [CPU](../item/cpu2.md) +- 2x T2 [内存](../item/ram3.md) +- 1x T1 [硬盘](../item/hdd1.md) +- 1x T2 [硬盘](../item/hdd2.md) + +T3的可放配件: +- 1x T3 扩展卡 (如[显卡](../item/graphicsCard1.md), [网卡](../item/lanCard.md)) +- 2x T2 扩展卡 +- 1x T3 [CPU](../item/cpu3.md) +- 2x T3 [内存](../item/ram5.md) +- 1x T2 [硬盘](../item/hdd2.md) +- 1x T3 [硬盘](../item/hdd3.md) +- 1x [软盘](../item/floppy.md) + +T4的可放配件: +- 3x T3 扩展卡 (如[显卡](../item/graphicsCard1.md), [网卡](../item/lanCard.md)) +- 1x T3 [CPU](../item/cpu3.md) +- 2x T3 [内存](../item/ram5.md) +- 2xT3 [硬盘](../item/hdd3.md) +- 1x [软盘](../item/floppy.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/case2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/case2.md new file mode 100644 index 000000000..ee87d2036 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/case2.md @@ -0,0 +1 @@ +#REDIRECT case1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/case3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/case3.md new file mode 100644 index 000000000..ee87d2036 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/case3.md @@ -0,0 +1 @@ +#REDIRECT case1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/caseCreative.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/caseCreative.md new file mode 100644 index 000000000..ee87d2036 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/caseCreative.md @@ -0,0 +1 @@ +#REDIRECT case1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/chameliumBlock.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/chameliumBlock.md new file mode 100644 index 000000000..b34abc2bb --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/chameliumBlock.md @@ -0,0 +1,8 @@ +# 染色方块 + +![So... blank.](oredict:oc:chameliumBlock) + +几篇[印刷电路板](../item/chamelium.md) 可以被变成特殊装饰用途的有色方块. + +可以被原版任意染色 + diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/charger.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/charger.md new file mode 100644 index 000000000..b92f3b82e --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/charger.md @@ -0,0 +1,13 @@ +# 充电机 + +![All right, let's do this.](oredict:oc:charger) + +充电机为移动的设备 [机器人](robot.md), [无人机](../item/drone.md) and [平板](../item/tablet.md)充能. 可以被红石激活。 + +充能速度被红石信号强度决定, 15强度最大. + +这个逻辑可以被[扳手](../item/wrench.md)反转。 + +当一个[平板](../item/tablet.md) 放入充电机后, 第一硬盘[hard drive](../item/hdd1.md) 也会被连接充电机的 [电脑](../general/computer.md)访问到 + +就像[软盘](../item/floppy.md)一样. 这允许在电脑和平板间传送数据。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/disassembler.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/disassembler.md new file mode 100644 index 000000000..75ed96844 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/disassembler.md @@ -0,0 +1,7 @@ +# 拆解器 + +![Build it, tear it down.](oredict:oc:disassembler) + +可以将大多数电脑拆成零件. 常用来回收不用的零件或者合错的东西,比如没有烧入系统或者程序的机器人 + +这会花费一些时间和能源,也可能被吞配件。 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/diskDrive.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/diskDrive.md new file mode 100644 index 000000000..c34bde088 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/diskDrive.md @@ -0,0 +1,15 @@ +# 软盘驱动器 + +![Going round and round and...](oredict:oc:diskDrive) + +用于读取[软盘](../item/floppy.md). 初期很有用,因为低级别的 [机箱](case1.md)没有软盘槽 + +你还需要操作系统如OpenOS,Plan9K,MineOS等,来启动[电脑](../general/computer.md). + +[OpenOS](../general/openOS.md) 安装盘可以用空的 [软盘](../item/floppy.md) 和[OC手册](../item/manual.md)合成. + +也可以被安装在机器人[robots](robot.md)里面来允许插入 [软盘](../item/floppy.md) + +在没有网卡的时候这是非常有用的数据传输方式了 + +可以 通过shift(蹲) + 右键,可以不打开软驱GUI装卸软盘 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/geolyzer.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/geolyzer.md new file mode 100644 index 000000000..f639ea6d9 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/geolyzer.md @@ -0,0 +1,5 @@ +# 地图扫描机 +![Xray](oredict:oc:geolyzer) +让电脑具有扫描周边地形的能力,会把周边的方块硬度分布描述出来,可以生成一个能够在[全息投影机](hologram1.md)显示出来的地图,并描绘方块硬度分布,因此某种程度上用好了就是矿追。 + +由于可能有奇怪的干扰,理论来说经常要多次扫描才能确认。它可以被作为升级安装在机器人和平板电脑上面,扫描消耗电池的能量。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram1.md new file mode 100644 index 000000000..c1cd02d22 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram1.md @@ -0,0 +1,11 @@ +# 全息投影机 + +![Is this the real life? Is this just fantasy?](oredict:oc:hologram1) + +一个巨大的显示屏, i.e. 可以显示独立的三维图形,就是那种全息的3D,偏振光原理那种(高中课本会讲) + +2级显示屏, 分辨率不变但是支持电脑定制每个像素的颜色 + +可以被[扳手](../item/wrench.md)旋转 [, + +可以在范围内任意放缩显示 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram2.md new file mode 100644 index 000000000..e1acf9676 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/hologram2.md @@ -0,0 +1 @@ +#REDIRECT hologram1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md new file mode 100644 index 000000000..cf8a4e9e4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md @@ -0,0 +1,48 @@ +# Blocks + +本索引列出了OC全部的的方块 如果要找物品点[这里](../item/index.md). + +Keep in mind that some of these may not be available, depending on the recipe set used. + +## Computers +* [机箱](case1.md) +* [单片机](microcontroller.md) +* [机架](rack.md) +* [机器人](robot.md) + +## Components + +### Input / Output +* [全息投影机](hologram1.md) +* [键盘](keyboard.md) +* [屏幕](screen1.md) + +### Storage +* [硬盘](diskDrive.md) +* [磁盘阵列](raid.md) + +### Extensions +* [适配器](adapter.md) +* [扫描器](geolyzer.md) +* [运动探测器](motionSensor.md) +* [红石IO接口](redstone.md) +* [转置器(注:直译)](transposer.md) +* [路径点](waypoint.md) + +## Assembly / Printing +* [3D打印](print.md) +* [3D打印机](printer.md) +* [组装器](assembler.md) +* [染色方块](chameliumBlock.md) +* [拆解器](disassembler.md) + +## Networking +* [线缆](cable.md) +* [VLAN分割器](netSplitter.md) +* [中继器](relay.md) + +## Power management +* [电容](capacitor.md) +* [充电器](charger.md) +* [能源转换](powerConverter.md) +* [能源分发](powerDistributor.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/keyboard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/keyboard.md new file mode 100644 index 000000000..8e3902023 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/keyboard.md @@ -0,0 +1,5 @@ +# Keyboard + +![QWERTY](oredict:oc:keyboard) + +在[屏幕](screen1.md)上打字 , 或者嵌入 [机器人](robot.md) 和 [平板](../item/tablet.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/microcontroller.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/microcontroller.md new file mode 100644 index 000000000..bcaf67e2d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/microcontroller.md @@ -0,0 +1,8 @@ +# Microcontroller + +![Don't belittle it.](block:OpenComputers:microcontroller) + +单片机通过[单片机箱](../item/microcontrollerCase1.md) 在[组装机](assembler.md)组装. 相比电脑他们弱得多 , 但是便宜. 另外他们无法和外界物件交互. + +单片机可以携带多种组件, 如 [CPU](../item/cpu1.md), [内存](../item/ram1.md), 扩展卡. 单片机无法携带[硬盘](../item/hdd1.md)只能烧入[E2PROM](../item/eeprom.md), +相比[机箱](case1.md)他们可以用一些特别的升级 比如[活塞升级](../item/pistonUpgrade.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/motionSensor.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/motionSensor.md new file mode 100644 index 000000000..0e409f438 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/motionSensor.md @@ -0,0 +1,7 @@ +# Motion Sensor + +![Don't. Blink.](oredict:oc:motionSensor) + +运动探测器允许 [电脑](../general/computer.md)探测生物. 如果生物移速快过阈值,将会向连接的电脑发出红石信号 [computers](../general/computer.md) +阈值可以在连接的电脑上用组件API调节 +探测范围8格, 不能有障碍物,生物走出范围或者连线上有障碍都会使得生物无法被探测。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/netSplitter.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/netSplitter.md new file mode 100644 index 000000000..55e32f7d7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/netSplitter.md @@ -0,0 +1,9 @@ +# Net Splitter + +![*.net *.split](oredict:oc:netSplitter) + +VLAN分割器能够让你控制子网的连接. 它不像 [中继器](relay.md) 或者 [能源转换](powerConverter.md) 那样直接连接相邻的子网. +每个边的连接都可以用扳手控制 (e.g. the [scrench](../item/wrench.md)). +接入红石信号之后, 所有连接反相. + +这个方块可以控制特定子网的连接. 使用[红石IO方块](redstone.md) 和 [红石卡](../item/redstoneCard1.md) 可以实现对他的自动化控制 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/powerConverter.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/powerConverter.md new file mode 100644 index 000000000..5a03b5f9d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/powerConverter.md @@ -0,0 +1,8 @@ +# Power Converter + +![One of us? One of us!](oredict:oc:powerConverter) + +能源转换器是最快捷的使用其他mod能源的办法了. +如果只是运行单台机器,那么不需要造这个东西。 如果你有一个只是偶尔使用的大电容你也不用做这个方块 +然而如果你想直接驱动[装配机](assembler.md) 或者 [充电机](charger.md), +这个东西往往比直接连接外部能源要给力 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/powerDistributor.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/powerDistributor.md new file mode 100644 index 000000000..79462fa99 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/powerDistributor.md @@ -0,0 +1,6 @@ +# Power Distributor + +![Power to the masses.](oredict:oc:powerDistributor) + +能源分配器能够将一个共享能源池(如[电容](capacitor.md))的能源分配出去, 使得子网络能够在不暴露元件的情况下分享能源 +它的作用是负载均衡,因此你会发现每个子网的能量供应都“差不多” \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md new file mode 100644 index 000000000..0f803aec6 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md @@ -0,0 +1,11 @@ +# 3D打印制品 + +![Any way you want me.](block:OpenComputers:print) + +3D打印制品由 [3D打印机](printer.md)制造. 他们主要作为装饰用途出现, 但也可以用作收发红石信号来扩展出一点点小的功能. + +可以通过放入 [3D打印机](printer.md)进行回收. 可以重用一点用来打印的 [油墨](../item/chamelium.md). 打印的颜料是不会回收的. + +长按shift(默认的OC扩展tip)会显示出当前打印制品的激活状态. + +兼容Forge Multipart. 在他们不碰撞,且单个方块的形状数量不超出上限的情况下它们可以被放入单个方块的空间,比如火炬,拉杆,线缆等. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md new file mode 100644 index 000000000..3fdb09cae --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md @@ -0,0 +1,18 @@ +# 3D Printer + +![2D printing is so yesteryear.](oredict:oc:printer) + +3D printers allow you to print any block of any shape, with any type of texture. To get started with 3D printers, you will need to place down a 3D printer block next to a computer. This will give access to the `printer3d` component API, allowing you to set up and print [models](print.md) using the provided functions. + +A more convenient way to setup 3D printers is to use Open Programs Package Manager (OPPM). Once installed (`oppm install oppm`), make sure you have an [internet card](../item/internetCard.md) in your [computer](../general/computer.md) and run the following command: +`oppm install print3d-examples` + +The examples can then be found in `/usr/share/models/` as .3dm files. Take a look through the example files for available options, in particular the `example.3dm` file. Alternatively, you can download the `print3d` and `print3d-examples` programs from OpenPrograms using `wget` and an [internet card](../item/internetCard.md). + +In order to be able to print the models, a 3D printer needs to be configured via a [computer](../general/computer.md). If set to print non-stop, the computer will no longer be required thereafter. You will also need to provide an [ink cartridge](../item/inkCartridge.md) and some [chamelium](../item/chamelium.md) as input materials. The amount of chamelium used depends on the volume of the 3D print, while the amount of ink used depends on the surface area of the printed item. + +To print an item, use the following command: +`print3d /path/to/file.3dm` +providing the path to the .3dm file. + +Documentation pertaining to creating your own models can be found in `/usr/share/models/example.3dm`. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/rack.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/rack.md new file mode 100644 index 000000000..9fbd629a5 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/rack.md @@ -0,0 +1,6 @@ +#机架 +![Free housing.](oredict:oc:rack) + +机架中可以存放各种电脑,如服务器,终端服务器等,组件之间可以通过GUI设定他们的连接关系。如果服务器里面安装了网卡等组件,那么机架里面的服务器也是可以互联的,但是他们只能用来传递消息,而不能直接互相看到。你的程序不能直接探测到一个机柜里面的其他设备 + +机架里有一条总线,如果要让组件互相可见,那么就连接到总线上。 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/raid.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/raid.md new file mode 100644 index 000000000..bbeeff0b0 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/raid.md @@ -0,0 +1,15 @@ +# Raid + +![40 man instance.](oredict:oc:raid) + +Raid箱提供了[硬盘](../item/hdd1.md)的磁盘阵列功能,如同现实的RAID0一样,通过多块磁盘并发写入同时提高了效率和容量 + + 组合的文件系统拥有所有硬盘容量之和的大小并且所有相连的电脑均可以访问RAID + +当且仅当3个以上的磁盘被放进RAID控制器时,这块些磁盘会被看作一块,允许每块磁盘大小不同 + +注意当你加入RAID的时候原来的盘数据会全部丢失掉,而从RAID移除一块硬盘也会直接导致整个RAID损坏 + +加回去也不会拯救这个事实,RAID会被重新初始化为空的磁盘 + +挖掉RAID方块则不会丢失数据,相应的磁盘可以被重新放到一个新的RAID里面继续用 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/redstone.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/redstone.md new file mode 100644 index 000000000..0b2c4594d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/redstone.md @@ -0,0 +1,12 @@ +# Redstone I/O + +![Hi Red.](oredict:oc:redstone) + +红石IO方块可以被用来远程读取和发射红石信号. 他就像1级和2级[红石卡](../item/redstoneCard1.md)的杂交品: + +可以收发简单的信号也可以收发信号群, 但是无法收发无线红石信号 + +When providing a side to the methods of the component exposed by this block, the directions are the global principal directions, i.e. it is recommended to use `sides.north`, `sides.east` and so on. + +如[红石卡](../item/redstoneCard1.md), 当红石变化的时候,这个方块会向连接的[电脑](../general/computer.md) 发送信号,(模拟或者信号束).也可以用来唤醒连接的[电脑](../general/computer.md) +如果达到一定的强度可以直接把电脑开机 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md new file mode 100644 index 000000000..a309b8925 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md @@ -0,0 +1,17 @@ +# Relay + +![Building bridges.](oredict:oc:relay) + +中继器允许子网间发送消息, 而不必把组件暴露给其他网络的 [电脑](../general/computer.md). 通常来说把组件限制在本地网络是个好主意(如果被不怀好意的熊控制了你的机器人,那么你家就完蛋了), + +可以用来避免[电脑](../general/computer.md) 链接到错误的 [屏幕](screen1.md) 或者避免组件崩溃 (可能崩掉电脑,并使之无法启动). + +中继器可以安装[无线网卡](../item/wlanCard.md) 来无线传递消息. 无线消息也可以被其他的中继器接受并转发, 或者是被有无线网卡的电脑收到 + +中继器也可以安装[连接卡](../item/linkedCard.md).此时他会将消息转发到链接卡的信道里面, 记得保持中继器能源 + +中继器不会记下包的路径, 因此请避免网络环路(现实中将触发广播风暴,全网瘫痪). 由于中继器资源不是无限的,过于频繁的发包将会导致丢包. + +你也可以通过升级来加速转发速度. + +包只会被转发有限次数(TTL),当TTL降为0时,包会被自动丢弃,缺省的TTL是5,每转发一次减去1 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md new file mode 100644 index 000000000..53f45877d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/robot.md @@ -0,0 +1,9 @@ +# Robot + +![His name was Tobor.](block:OpenComputers:robot) + +机器人不像 [电脑](../general/computer.md), 他们是可以像一个玩家一样去和世界交互的. 不过它们不能直接和其他设备交互! 如果需要和 [电脑](../general/computer.md) 和其他机器人通讯, 那么用[无线网卡](../item/wlanCard.md), 或者通过[红石卡](../item/redstoneCard1.md)实现更底层的协议去通信. + +机器人通过将任意等级[机箱](case1.md) 放入 [组装机](assembler.md)制作的. 更高规格的[机箱](case1.md) 可以做出更复杂的机器人. 机器人的复杂度会显示在 [组装机](assembler.md),复杂度取决于携带和安装的卡片和扩展数量; 级别越高,数量越多,越复杂,达到一定程度组装机将罢工. + +机器人可以放入各种升级来加强. 包括 [物品栏升级](../item/inventoryUpgrade.md) [物品栏控制器](../item/inventoryControllerUpgrade.md) [储罐升级](../item/tankUpgrade.md), [导航升级](../item/navigationUpgrade.md)等. 卡和扩展都可以在机器人运行时热替换. 机器人也可以安装软驱来插软盘, 用来安装 [openOS](../general/openOS.md)(你也可以在组装的时候就带上预装系统的硬盘). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md new file mode 100644 index 000000000..804662776 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md @@ -0,0 +1,12 @@ +# Screens + +![See this?](oredict:oc:screen1) + +显示屏需要和显卡一起使用, 使得电脑能够显示文本.不同型号的屏幕能够显示不同的东西, 比如不同的分辨率和色深. 从低分单色屏到高分256色屏幕,可用分辨率取决于最差的那个配件。 当使用T1显卡和T3屏幕时,仅T1的分辨率和色深可用,反之亦然。但是T3显卡的运行速度会快些 + +屏幕可以相邻放置组成多方块屏幕,需要朝向一样. 旋转的上下方向也要一直. 屏幕旋转方向可以通过拿在手上的屏幕里面的箭头确定.屏幕大小对分辨率无影响,屏幕也可以染色来控制哪两块屏幕可以连接,手持染料右键即可,染料不会消耗掉. 屏幕在敲下来以后仍然保持他的颜色. 不同色不会连一起,同色不同型也不会.T2和T3屏支持鼠标. 屏幕会响应点击事件(只会在有键盘的时候或者是按下蹲的时候打开),在屏幕没有键盘的时候,蹲下是唯一操作办法.注意在交互是是否打开屏幕是可以通过组件API控制的T3可以配置为接受更高的点击精度,这可以让人判定是点击上半个字符还是下半个,可以用来模拟更高分辨率的屏幕。 + +分辨率如下: +T1: 50x16, 单色. +T2: 80x25, 16色 +T3: 160x50, 256色 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen2.md new file mode 100644 index 000000000..9a0e09ec3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen2.md @@ -0,0 +1 @@ +#REDIRECT screen1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen3.md new file mode 100644 index 000000000..9a0e09ec3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen3.md @@ -0,0 +1 @@ +#REDIRECT screen1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md new file mode 100644 index 000000000..1fa933e32 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/switch.md @@ -0,0 +1,13 @@ +# Switch + +![Building bridges.](oredict:oc:switch) + +*本方块过期了,请换用中继器 + +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). + +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. + +Packets are only re-sent a certain number of times, so chaining an arbitrary number of switches or access points is not possible. By default, a packet will be re-sent up to five times. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/transposer.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/transposer.md new file mode 100644 index 000000000..458291835 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/transposer.md @@ -0,0 +1,9 @@ +# Transposer + +![Such a poser.](oredict:oc:transposer) + +转置器连接了红石控制的漏斗和[机器人](robot.md), 允许 [电脑](../general/computer.md)-控制液体和物品在相邻方块转移. + +*本方块不自带物品栏.* + +本方块具有探测容器物品的能力 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md new file mode 100644 index 000000000..de7318228 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md @@ -0,0 +1,6 @@ +# Waypoint + +!["This way!" - "No, that way!"](oredict:oc:waypoint) +路径点重点不在本身,而是如何使用. 导航升级可以探测路径点, 因此安装了这种升级的设备就可以通过它导航. 这在对机器人和无人机写高度可重用的程序时很有用. +注意导航升级报告的路径点位置指的是路径点方块的正面相邻的方块(粒子效果指示). 因此你可以把他放在箱子的边上或者上方, 通过将路径点看作“箱子上方”,而不必在你的程序里面旋转路点坐标。 +一个路点有两个属性: 一个是收到的红石信号强度, 一个是可编辑的标签. 它是32长度字符串,并且可以在连接路点的设备上进行编辑,它告诉我们路点该如何使用 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/general/computer.md b/src/main/resources/assets/opencomputers/doc/zh_CN/general/computer.md new file mode 100644 index 000000000..c50679556 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/general/computer.md @@ -0,0 +1,9 @@ +# Computers + +电脑通过组合不同的材料, [方块](../block/index.md) 和组件制造. 你最少需要一个机箱,一个屏幕,一块键盘,一个cpu,内存若干,一块E2PROM。 + +低级别机箱需要一个[软驱]来读[软盘](../item/floppy.md)(../block/diskDrive.md)。 第一次运行需要一个[OpenOS](openOS.md) [软盘](../item/floppy.md)来安装操作系统到[硬盘](../item/hdd1.md),一旦安装到硬盘,那么软盘就不需要插在机器里面了. 附加软件也经常以软盘形式出现,如开放式电脑包管理器OPPM的软盘就可以从地牢翻出来。 + +最后就是要给电脑接电源了,本mod兼容大多数电源,不论是EU还是RF还是什么奇怪的,大部分方块可以被直接供电 + +对于大型电脑网络,推荐使用[能源转换器](../block/powerConverter.md)供电,并以[能源分发器](../block/powerDistributor.md)分发 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/general/example.md b/src/main/resources/assets/opencomputers/doc/zh_CN/general/example.md new file mode 100644 index 000000000..3bdda70bc --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/general/example.md @@ -0,0 +1,69 @@ +# Headline with more lines [with link](redirect1.md) and *some* more + +This is some test text for the subset of Markdown supported by the planned ingame documentation system for OpenComputers. +![This is a tooltip...](opencomputers:textures/gui/printer_ink.png) +![This is a tooltip...](opencomputers:/textures/gui/printer_material.png) +*This* is *italic* text, ~~strikethrough~~ maybe abc-ter **some** text **in bold**. Is _this underlined_? Oh, no, _it's also italic!_ Well, this [a link](../index.md). +![This is rendered live.](oredict:oc:assembler) +## Smaller headline [also with *link* but this __one__ longer](../block/adapter.md) + +![This is another tooltip.](item:OpenComputers:item@23) + +some text directly above the item stack renderer to test spacing +![All the colors.](oredict:craftingPiston) +some text directly below the item stack renderer to test spacing + +This is *italic +over two* lines. But *this ... no *this is* **_bold italic_** *text*. + +### even smaller + +*not italic *because ** why would it be*eh + +`test for code` +`that's not code yet` +`function f(a)` +` testingIndent(a)` +` do` +` lalala()` +` end` +`end` +yeah, line spacing is a bit low, but otherwise too little text fits on one screen. +this is some `code` that's inline. then `some more CODE that` line wraps and so on. + +isn't*. + + # not a header + +* this is a list item and the text that will be wrapped will be indented appropriately +- this should also `work for code rendered text, if it doesn't i` will be a sad person + +asdasd ![oh my god, the recursion!](img/example.png) qweqwe + +And finally, [this is a link!](https://avatars1.githubusercontent.com/u/514903). + +![broken item image](item:this is broken) +![broken item image](block:this is broken) +![broken item image](oredict:this is broken) + +wrap testing +12345678901234567890.1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 +`123456789012345678901234567890.12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890` + +* 12345678901234567890.1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890 +- `123456789012345678901234567890.12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890` + +this is a test for an![](oredict:oc:cpu1)an inline image kakakakalalsd 123 as + +this is a test for an![](oredict:oc:cpu1) +an image with a break after it + +this is a test for an +![](oredict:oc:cpu1) +an image between two lines + +this is a test for an + +![](oredict:oc:cpu1) + +an image between two blank lines diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/general/lua.md b/src/main/resources/assets/opencomputers/doc/zh_CN/general/lua.md new file mode 100644 index 000000000..9df10cb18 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/general/lua.md @@ -0,0 +1,15 @@ +# Lua + +[LUA编程手册](http://www.lua.org/manual/5.2/manual.html) 和 [LUA编程第一版](http://www.lua.org/pil/) 是学习基本功能并熟悉lua标准库的好帮手. [OpenOS](openOS.md) 尽可能准确的模拟标准库,当然有些许变化,比如某些高权限的debug库去掉了. 这些不同点写在了[这里](http://ocdoc.cil.li/api:non-standard-lua-libs). + +require命令用来在脚本里引用模块 +比如 +`local component = require("component")` //引入组件API相关,所有组件api的函数可以调用了 +`local rs = component.redstone` //引入红石相关,红石API可以用了 +这将允许你使用[红石卡](../item/redstoneCard1.md)相关的组件功能,如: +`rs.setOutput(require("sides").front, 15)` //将前方的红石信号强度设为15 +所有标准库不需要用require引用 + +重要:在Lua解释器的环境下请不要用local修饰符(脚本里面没有这个限制),这会在命令完成后将这个变量回收掉,你会发现你得不到任何变量,这是由于mod环境资源有限,不可能随时将库载入内存。 + +OpenOS提供了大量第三方库,从控制电脑连接的组件到机器人和无人机,有些库只有在相关卡安装后才能用,也就是说这些组件相当于包含了一个小型的只读文件系统 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/general/openOS.md b/src/main/resources/assets/opencomputers/doc/zh_CN/general/openOS.md new file mode 100644 index 000000000..3b18d138d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/general/openOS.md @@ -0,0 +1,11 @@ +# OpenOS + +OpenOS 是OpenComputers里面的基本操作系统. 必须用它来进行[电脑](computer.md)的第一次启动, 可以通过用空的 [软盘](../item/floppy.md) 和 [手册](../item/manual.md) 合成. + +合成后, [此软盘](../item/floppy.md) 就可以放进连接电脑的 [软驱](../block/diskDrive.md)来启动电脑,OpenOS的软盘是只读的,所以推荐将系统安到硬盘里面。如果要安装到硬盘,请在启动完成后在shell敲入install,选择OpenOS的编号 + +OpenOS可以在除了单片机和无人机外的任何设备安装,安装好了以后,软盘可以被拔出 + +OpenOS拥有大量内建命令, 最有用的是lua,将打开lua解释器,这里可以测试命令, 在将命令写入lua文件脚本前试验组件api.注意解释器启动时的信息,会告诉你如何显示命令结果,如何退出。 + +要得到编程的信息请转到[Lua Programming](lua.md) . 运行脚本的话敲入文件名回车就行了(比如, 通过在shell敲下script,就可以运行`script.lua`). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md b/src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md new file mode 100644 index 000000000..54ac19b41 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md @@ -0,0 +1,59 @@ +# 快速入门 + +这篇文章叫做"如何组装第一台电脑". 为了使你的[电脑](computer.md)运作, 你要正确的设定他. 我们有多个档次的电脑, 但我们会从基础档开始. + +**Disclaimer**: 这是手把手的教程, 会告诉你后面出现问题要怎么处理, 因此这教程比较长. 如果现实中没有装机经历, 并且你是萌新, 那么请耐心读完. + +首先你需要一个[机箱](../block/case1.md). 这个方块将容纳你的电脑配件, 并定义你电脑的行为. + +![A tier two computer case.](oredict:oc:case2) + +比如你要挑一个适合你的 [显卡](../item/graphicsCard1.md)(GTX690,GTX1080,划掉), 还可能需要一个[网卡](../item/lanCard.md), 一块 [红石卡](../item/redstoneCard1.md) , 如果你是可以调创造的狗管理你还可以拿出 [调试卡](../item/debugCard.md). + +打开[机箱](../block/case1.md)你会看到一系列的槽位. 上面写了槽位的数量,可以放什么样的配件进去,等 (槽位小字有写),这些数据取决于机箱档次. + +![GUI of a tier two computer case.](opencomputers:doc/img/configuration_case1.png) + +如果没放东西, [机箱](../block/case1.md)完全没用. 如果你试图按下 [电脑](computer.md)的开机键, 他只会立刻在你的聊天框输出一条错误, 用蜂鸣声提示你. 幸运的是他提醒了你要怎么去做: 电脑需要能源. 把你的电脑接发电机, 或者是接到[能量转换器](../block/powerConverter.md). + +这次启动, 他会告诉你电脑需要 [CPU](../item/cpu1.md). CPU分不同级别,越高级的要越多的东西合成,执行速度也快。选择一款CPU,丢进你的[机箱](../block/case1.md). + +好的这次他要你放[内存](../item/ram1.md)了 . 注意警报变化了: 长-短. 越高级的 [内存](../item/ram1.md)容量越大,跑的程序越多. 运行 [OpenOS](openOS.md), 这篇教程的目标, 需要至少2条T1 [内存](../item/ram1.md). + +ok,做的很好,现在[机箱](../block/case1.md) 变成这样了: + +![Partially configured computer.](opencomputers:doc/img/configuration_case2.png) + +别急, 现在虽然不会打印错误了, 但是他也什么都做不了. 至少他还会发出两声警报. 这意味着电脑进入执行状态,但是未能成功. In other words: it technically runs! This is where a very useful tool comes into play: the [analyzer](../item/analyzer.md). This tool allows inspecting many of OpenComputers' blocks, as well as some blocks from other mods. To use it on the [computer](computer.md), use the [analyzer](../item/analyzer.md) on the case while sneaking. + +你会在聊天框看到 [电脑](computer.md) 遇到的错误: + +`no bios found; install configured EEPROM` + +这说明你需要一个刷写程序的E2PROM芯片装入机箱来指定电脑的任务 + +注意那个 configured,需要刷一个程序。合成E2PROM很简单,但是刷写程序需要电脑,是不是难了点,这里我们要直接合成一个预刷写LUA BIOS的E2PROM,使用E2PROM和你的手册合成,将这个ROM丢进机箱,开机! + +啊哈哈,还是啥都没有,但是我们看到了一条信息 + +`no bootable medium found; file not found` + +说明Lua BIOS运行正常,它执行了对文件系统的搜索,如根目录含有init.lua的[软盘](../item/floppy.md)或者[硬盘](../item/hdd1.md),因此我们现在需要一张带有OpenOS安装的软盘(用空磁盘+手册合成) + +嗯,如果你用了T2机箱,那么你还要做一个[软盘驱动器](../block/diskDrive.md)来读盘,如果是T3及以上那么直接放到机箱就行了,如果使用驱动器,那么将驱动器放在电脑边上,插入软盘,启动 + +好的,他启动了。如果有什么问题的话,可以使用[分析仪](../item/analyzer.md)排查。不过我们的电脑应该跑起来了。 + +最难的部分已经过去了,剩下就是如何让电脑输出信息,并且让电脑接受输入 + +你需要将一个[屏幕](../block/screen1.md)安放在电脑上 ,并在机箱安装[显卡](../item/graphicsCard1.md) + +![No, it's not a flatscreen.](oredict:oc:screen2) + +之后你就可以看到电脑的输出,然后电脑就会等待你的操作了,尝试一下吧!敲入 'lua' 并按下回车,你将会得到lua交互解释器的帮助(英文),你可以测试基本lua命令,更多信息见[the Lua page](lua.md) + +![It lives!](opencomputers:doc/img/configuration_done.png) + +之后就可以建造更复杂的 [电脑](computer.md), [服务器](../item/server1.md) ,用 [组装机](../block/assembler.md) 组装[机器人](../block/robot.md), [无人机](../item/drone.md), [单片机](../block/microcontroller.md) 和 [平板](../item/tablet.md). + +Happy coding! \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/index.md b/src/main/resources/assets/opencomputers/doc/zh_CN/index.md new file mode 100644 index 000000000..0036a4296 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/index.md @@ -0,0 +1,47 @@ +# OpenComputers Manual + +OpenComputers 是一个持久化,模块化,高度可定制化的mod,在游戏中提供了 [电脑](general/computer.md), [服务器](item/server1.md), [机器人](block/robot.md), 和 [无人机](item/drone.md) .所有设备均可通过LUA5.2编写程序, 实现各种复杂的系统. + +通过 [关于手册](item/manual.md)学习mod (绿字是链接,可点击). + +## 内容 + +### 设备 +- [电脑](general/computer.md) +- [服务器](item/server1.md) +- [单片机](block/microcontroller.md) +- [机器人](block/robot.md) +- [无人机](item/drone.md) + +### 软件和程序编写 +- [OpenOS](general/openOS.md) +- [Lua](general/lua.md) + +### 方块和物品 +- [物品](item/index.md) +- [方块](block/index.md) + +### Guides +- [Getting Started](general/quickstart.md) + +## Overview + +如上文所说, 电脑可以持久化的存储自己的状态, 意味着运行的 [电脑](general/computer.md) 即使在所属区块被卸载时也能保持住自己的状态. 也就是说当玩家离开 [电脑](general/computer.md)所在的区块, 或者退出后, [电脑](general/computer.md) 将会记住离开前最后一刻的状态, 并在区块被加载后重新从断电恢复运转[电脑](general/computer.md). 特性 不包括[平板](item/tablet.md). + +所有的设备高度模块化,可以用多种材料制作, 正如现实的 [电脑](general/computer.md) . 善于发现的玩家能够不断将他的设备打造成理想的样子. 只要想,设备甚至在设计不满意的时候可以被 [拆卸](block/disassembler.md) 并重组. 对于 [电脑](general/computer.md) 和 [服务器](item/server1.md), 设备可以被通过GUI热插拔。 + +OpenComputers 与多个mod兼容,不论是方块还是实体。(通过 [适配器](block/adapter.md), 或者对 [机器人](block/robot.md) 和 [无人机](item/drone.md)进行适当的升级). 多个mod均可以用来为这些电脑供能, 包括但不限于以下: RF,EU, MJ,AE2能源 甚至是因式分解mod的能量. + +虽说有些限制,OC mod依然提供了大量的可能性. [电脑](general/computer.md) 是基础, 能够做到大多数事情, CPU是核心. [电脑](general/computer.md) 可以访问周围6个面的组件. [服务器](item/server1.md) 可以通过 [总线](item/componentBus1.md)链接更多设备 (内部或外部互联), ; 但是服务器只能被安装在[机架](block/rack.md), 他只能被从[机架](block/rack.md)的一侧被访问到, 访问的侧可以被从 [机架](block/rack.md) GUI设定. [单片机](block/microcontroller.md) 功能十分受限 (比起普通的[电脑](general/computer.md)), 因为他们只有可怜的存储[硬盘](item/hdd1.md) 和外置存储 [软盘驱动器](block/diskDrive.md) , 意味着通常的 [OpenOS](general/openOS.md) 无法被安装到 [单片机](block/microcontroller.md). [单片机](block/microcontroller.md)只有一个 [E2PROM](item/eeprom.md)槽, 只能被编程为执行有限的简单任务. + +[机器人](block/robot.md) 是移动的 [电脑](general/computer.md), 可以与世界交互 (但无法和外部电脑方块交互).不像 [电脑](general/computer.md), [机器人](block/robot.md) 一经建造,内部的部件就不能再被改变或者去除. 为了解决这个问题, [机器人](block/robot.md) 可以被 [升级](item/upgradeContainer1.md) 或者 [卡片](item/cardContainer1.md) 插入, 允许热升级或者插拔卡片. [OpenOS](general/openOS.md) 可以在 [机器人](block/robot.md) 上面通过放一个[硬盘](block/diskDrive.md) 安装, 也允许插入 [软盘](item/floppy.md) disks, 或者插入预装了OpenOS的硬盘. 重设机器人需要将机器人[拆解](block/disassembler.md) . [无人机](item/drone.md)是阉割版机器人 [robots](block/robot.md). 他们只有少量物品栏,移动方式也和机器人不同, 像[单片机](block/microcontroller.md)一样安不上操作系统, [无人机](item/drone.md) 可以被插入预编程的 [E2PROM](item/eeprom.md)). 大部分情况下, [机器人](block/robot.md) 和 [无人机](item/drone.md) 使用相同的配件和更新; 然而, 这些东西在无人机和机器人的表现不统一, [物品栏升级](item/inventoryUpgrade.md) 每次只提供四个物品栏, 最多8个, [机器人](block/robot.md) 可以携带最多四个,每个提供16个物品的 [物品栏升级](item/inventoryUpgrade.md) + +##机器人 + +制作机器人请将机箱放到组装器里面,这样就可以做机器人了 + +可以装入各种升级和卡片,配备软驱的机器人还可以安装OS + +机器人的汉化卡死,所以就简单的说下好了 + +E文好的可以去看E文手册 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/abstractBusCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/abstractBusCard.md new file mode 100644 index 000000000..0d9ad2490 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/abstractBusCard.md @@ -0,0 +1,5 @@ +# 抽象总线卡 + +![More networking!](oredict:oc:abstractBusCard) + +允许[电脑](../general/computer.md), [服务器](server1.md) and [机器人](../block/robot.md) to interact with StargateTech2's abstract bus. When the card is installed, these blocks will connect to the abstract bus and a component becomes available to the machine that can be used to send messages across the abstract bus. Incoming abstract bus messages are converted to signals that are injected into the machine. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/acid.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/acid.md new file mode 100644 index 000000000..6ca0004fd --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/acid.md @@ -0,0 +1,9 @@ +# 酸液 + +![Reflux?](oredict:oc:materialAcid) + +可口的[citation needed] 遥指, 如果你想找点乐子的话就喝下去吧www。 当然这可能烧了你的食管. 也可以作为多种物资的原料 + +一个主要用处是从系统移除[纳米机器](nanomachines.md) + +在困难模式下它用来把[电路板](circuitBoard.md) 刻蚀为 [印刷电路板](printedCircuitBoard.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/alu.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/alu.md new file mode 100644 index 000000000..f0c701b79 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/alu.md @@ -0,0 +1,5 @@ +# 逻辑运算单元 + +![I can into logic!](oredict:oc:materialALU) + +用来合成计算组件, 比如[CPU](cpu1.md), [显卡](graphicsCard1.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/analyzer.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/analyzer.md new file mode 100644 index 000000000..b8d051f9b --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/analyzer.md @@ -0,0 +1,7 @@ +# 分析仪 + +![Must. Resist. Bad. Joke.](oredict:oc:analyzer) + +一个小巧的,用来探测OC方块信息的仪器.只要简单的蹲下并右键就可以把方块信息打印出来. 信息从基础的仪器地址, 到他在子网内的能源等级,到让电脑当机的错误信息 + +另外一个用处是ctrl+右键, 这些信息会拷贝到剪贴板,可以粘贴到电脑终端 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/angelUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/angelUpgrade.md new file mode 100644 index 000000000..c3d27f85d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/angelUpgrade.md @@ -0,0 +1,5 @@ +# 天使升级 + +![哈利路亚!.](oredict:oc:angelUpgrade) + +允许[机器人 ](../block/robot.md)在空中凭空放置方块,而不用搭一个柱子挨着 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/apu1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/apu1.md new file mode 100644 index 000000000..080add58f --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/apu1.md @@ -0,0 +1,5 @@ +# APU + +![Awesomest Probability Unifier.](oredict:oc:apu1) + +[CPU](cpu1.md)和[显卡](graphicsCard1.md)的结合,AMD(农企)首创. 可以省一个格子,当然了这块显卡性能肯定没有独显厉害www \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/apu2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/apu2.md new file mode 100644 index 000000000..cc94b771d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/apu2.md @@ -0,0 +1 @@ +#REDIRECT apu1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/arrowKeys.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/arrowKeys.md new file mode 100644 index 000000000..2a5967ac8 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/arrowKeys.md @@ -0,0 +1,5 @@ +#方向键 + +![Just be grateful it's not made from arrows.](oredict:oc:materialArrowKey) + +At the risk of repeating myself: 制造 [键盘](../block/keyboard.md)的配件. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade1.md new file mode 100644 index 000000000..70fe82527 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade1.md @@ -0,0 +1,5 @@ +#电池升级 + +![Made of Metal.](oredict:oc:batteryUpgrade1) + +三星电子,超长待机!由真实大帝代言。 用于[机器人](../block/robot.md) , [平板](tablet.md),让他们可以在野外坚持更久,等级越高存的越多。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade2.md new file mode 100644 index 000000000..0281a4533 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade2.md @@ -0,0 +1 @@ +#REDIRECT batteryUpgrade1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade3.md new file mode 100644 index 000000000..0281a4533 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/batteryUpgrade3.md @@ -0,0 +1 @@ +#REDIRECT batteryUpgrade1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/buttonGroup.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/buttonGroup.md new file mode 100644 index 000000000..90e31bd09 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/buttonGroup.md @@ -0,0 +1,4 @@ +# 按钮组 + +![Needs more buttons.](oredict:oc:materialButtonGroup) +用于制造[键盘](../block/keyboard.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/card.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/card.md new file mode 100644 index 000000000..45f7a49d7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/card.md @@ -0,0 +1,5 @@ +# 卡 + +![Can't be read.](oredict:oc:materialCard) + +通用合成组件 ( [显卡](graphicsCard1.md) [网卡](lanCard.md)等等). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md new file mode 100644 index 000000000..2878b549f --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md @@ -0,0 +1,5 @@ +# 卡包 + +![Can haz cards!](oredict:oc:cardContainer1) + +[机器人](../block/robot.md) 的物品栏升级之一,允许热插拔卡。单个槽最大卡数等于这个升级的等级. 这个容器的复杂度是一般的两倍. 参见 [here](../block/robot.md) 机器人复杂度 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer2.md new file mode 100644 index 000000000..16d29de27 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer2.md @@ -0,0 +1 @@ +#REDIRECT cardContainer1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer3.md new file mode 100644 index 000000000..16d29de27 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer3.md @@ -0,0 +1 @@ +#REDIRECT cardContainer1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/chamelium.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chamelium.md new file mode 100644 index 000000000..8edc00cd3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chamelium.md @@ -0,0 +1,9 @@ +# 油墨 + +![From Chameleon, in case you were wondering.](oredict:oc:chamelium) + +油墨是用于3D打印的有序合成物品. 它本身没什么特色,只能拿来盖盖单色的墙. + +你可以把它做成 [油墨块](../block/chameliumBlock.md). + +正如tip所说, 吃下去的后果不可描述,小心使用,或者最好就别吃他 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip1.md new file mode 100644 index 000000000..6c024049f --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip1.md @@ -0,0 +1,5 @@ +# 微芯片 + +![Not the edible ones.](oredict:oc:circuitChip1) + +微芯片在合成中很重要.他们有不同的型号,对应不同型号的产物 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip2.md new file mode 100644 index 000000000..5679bbdeb --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip2.md @@ -0,0 +1 @@ +#REDIRECT chip1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip3.md new file mode 100644 index 000000000..5679bbdeb --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chip3.md @@ -0,0 +1 @@ +#REDIRECT chip1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/chunkloaderUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chunkloaderUpgrade.md new file mode 100644 index 000000000..4c61216f3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/chunkloaderUpgrade.md @@ -0,0 +1,7 @@ +#区块加载升级 + +![Not going anywhere.](oredict:oc:chunkloaderUpgrade) + +可以被安装在任意设备(如[机器人](../block/robot.md) 和 [微控制器](../block/microcontroller.md)) 来允许他加载所在的区块和相邻的区块. 这消耗能源,可以被组件API开关. + +设备启动时自动启用, 在关机时自动停止. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/circuitBoard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/circuitBoard.md new file mode 100644 index 000000000..511fdfea3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/circuitBoard.md @@ -0,0 +1,5 @@ +# 电路板 + +![Needs more gold.](oredict:oc:materialCircuitBoard) + +从粗电路板合出来的东西 [raw circuit boards](rawCircuitBoard.md) 用于制作 [印刷电路板](printedCircuitBoard.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus1.md new file mode 100644 index 000000000..ff9da1eb4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus1.md @@ -0,0 +1,10 @@ +# 组件总线 + +![I need mooooore.](oredict:oc:componentBus1) + +组件总线是[服务器](server1.md)专用的升级, 允许服务器[server](server1.md) 和更多的组件同时通讯, 而不是当机. 像CPU一样有级别,高级总线可以允许服务器通讯更多的组件 + +总线通讯限制如下 +- T1: 8 +- T2: 12 +- T3: 16 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus2.md new file mode 100644 index 000000000..a49cd378a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus2.md @@ -0,0 +1 @@ +#REDIRECT componentBus1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus3.md new file mode 100644 index 000000000..a49cd378a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/componentBus3.md @@ -0,0 +1 @@ +#REDIRECT componentBus1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/controlUnit.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/controlUnit.md new file mode 100644 index 000000000..5cd914623 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/controlUnit.md @@ -0,0 +1,5 @@ +# 控制单元 + +![With built-in cruise control.](oredict:oc:materialCU) + +高级电路的合成单元,如 [CPU](cpu1.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu1.md new file mode 100644 index 000000000..2f2ee2b32 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu1.md @@ -0,0 +1,14 @@ +# CPU + +![Braaainz.](oredict:oc:cpu1) + +[电脑](../general/computer.md) 和 [服务器](server1.md)的中央处理器. 定义了 [电脑](../general/computer.md)架构, 以及连接组件上限 级别越高,每tick可以进行的函数调用越多 或者说,高级就牛逼 + +CPU的组件上限: +- T1: 8 +- T2: 12 +- T3: 16 + +[服务器](server1.md)里面, 这个数量可以通过安装 [组件总线](componentBus1.md)提升 + +如果连接数量超过上限,会无法开机,运行中的机器会宕机。 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu2.md new file mode 100644 index 000000000..b62149ec4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu2.md @@ -0,0 +1 @@ +#REDIRECT cpu1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu3.md new file mode 100644 index 000000000..b62149ec4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cpu3.md @@ -0,0 +1 @@ +#REDIRECT cpu1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/craftingUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/craftingUpgrade.md new file mode 100644 index 000000000..8fb064307 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/craftingUpgrade.md @@ -0,0 +1,5 @@ +# 合成升级 + +![Crafty.](oredict:oc:craftingUpgrade) + +允许 [机器人](../block/robot.md)在自己的[物品栏](../item/inventoryUpgrade.md)进行无序和有序合成. 左上的3X3格子将会成为合成空间, 物品将根据合成表重新排布. 合成结果将会回到机器人物品栏. 捡起物品后,会被放在指定格子; 失败则会放在相邻的空格子. 如果没有格子了,物品会被丢出去 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cuttingWire.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cuttingWire.md new file mode 100644 index 000000000..f9f7ee1fc --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cuttingWire.md @@ -0,0 +1,5 @@ +# 剥过的线 + +![Not a garrote. Honest.](oredict:oc:materialCuttingWire) + +在困难合成会用到的东西,用于合成 [原始电路板](rawCircuitBoard.md). 很蛋疼 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard1.md new file mode 100644 index 000000000..3d7c94fee --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard1.md @@ -0,0 +1,7 @@ +# 数据卡 + +![Contrary to popular belief, it does not store data.](oredict:oc:dataCard1) + +一种提供了多个难以在架构上实现,或者是在那里跑的很慢的算法的卡,可以看作是协处理器,用于处理hash,压缩等操作 + +注意每次调用处理的数据有限,并且很吃能量. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard2.md new file mode 100644 index 000000000..13f060838 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard2.md @@ -0,0 +1 @@ +#REDIRECT dataCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard3.md new file mode 100644 index 000000000..13f060838 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/dataCard3.md @@ -0,0 +1 @@ +#REDIRECT dataCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade1.md new file mode 100644 index 000000000..14b9d8211 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade1.md @@ -0,0 +1,10 @@ +# 数据库升级 + +![Living in the database.](oredict:oc:databaseUpgrade1) + +可以配置为存储一系列物品信息, 进而被其他组件所用. 尤其是那种名字一样但是NBT标签不一样的物品, 回调里面并不会作为物品描述符的一部分. + +配置数据库, 首先右键打开.把你想配置的物品放在上面的物品栏,会存储一个假的物品 + +也可以被 +[物品栏控制器](inventoryControllerUpgrade.md) 和[扫描器](../block/geolyzer.md)的组件API配置 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade2.md new file mode 100644 index 000000000..196a017a3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade2.md @@ -0,0 +1 @@ +#REDIRECT databaseUpgrade1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade3.md new file mode 100644 index 000000000..196a017a3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/databaseUpgrade3.md @@ -0,0 +1 @@ +#REDIRECT databaseUpgrade1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/debugCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/debugCard.md new file mode 100644 index 000000000..aa35df5a7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/debugCard.md @@ -0,0 +1,9 @@ +# Debug Card + +![Wait, if I- oooooh.](item:OpenComputers:item@73) + +The debug card is a creative-only item that was originally only intended to make debugging things easier, by automating some processes. It has since gotten a bunch more functionality, making it quite useful for custom map-making. + +Note that you can use sneak-activate while holding the card to bind it to you or unbind it, meaning `runCommand` will be performed using your permission levels instead of the default OpenComputers ones. + +A debug card can receive messages similar to a [linked card](linkedCard.md), firing a `debug_message` event. You can send such a message using either another debug card's `sendDebugMessage` or the Minecraft command `/oc_sendDebugMessage` (or `/oc_sdbg`). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/disk.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/disk.md new file mode 100644 index 000000000..30e7f69c1 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/disk.md @@ -0,0 +1,5 @@ +# 磁盘 + +![World. RIP Terry Pratchett.](oredict:oc:materialDisk) + +基础组件,用于合成软盘和硬盘 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/diskDriveMountable.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/diskDriveMountable.md new file mode 100644 index 000000000..9d0cb41a1 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/diskDriveMountable.md @@ -0,0 +1,5 @@ +# 可挂载的磁盘 + +![Snuggly](oredict:oc:diskDriveMountable) + +大体相当于[软盘驱动器](../block/diskDrive.md),只是被安装到 [机架](../block/rack.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/drone.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/drone.md new file mode 100644 index 000000000..b4a2778c1 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/drone.md @@ -0,0 +1,5 @@ +# 无人机 + +![Big brother is trying to watch you.](item:OpenComputers:item@84) + +通过 [无人机箱](droneCase1.md) 在 [装配机](../block/assembler.md)制造. 他们是实体的[机器人](../block/robot.md), 便宜但功能也受限.移动比 [机器人](../block/robot.md)快些, 通常由[电脑](../general/computer.md)的程序控制. 需要烧写过的 [E2PROM](eeprom.md) 启动 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase1.md new file mode 100644 index 000000000..ddf60c090 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase1.md @@ -0,0 +1,33 @@ +# 无人机箱 + +![Droning on.](oredict:oc:droneCase1) + +无人机箱[drones](drone.md) 被用于在 [装配机](../block/assembler.md)组装机器人. [无人机](drone.md) 是轻量, 快速的便携机器,其功能受限(只有少量的升级和插槽). 不像 [机器热](../block/robot.md) 能使用工具, 它们也只能和世界进行有限的交互. + +速度也下降,但能源消耗也很少. 他们很胜任于少量的搬运物品和侦察. 将[无人机](drone.md) 和 [机器人](../block/robot.md) 配对是极好的, [机器人](../block/robot.md) 进行困难的运算, [无人机](drone.md) 作为传感器和执行机构. + +像 [单片机](../block/microcontroller.md)一样, [无人机](drone.md) 只能用[E2PROM](eeprom.md)编程.E2PROM通过将无人机和另一块E2PROM合成来改变,上一块E2PROM会返还 +T1无人机箱可以带这些: +- 1x T1 [CPU](cpu1.md) +- 1x T1 [内存](ram1.md) +- 1x [E2PROM](eeprom.md) +- 1x T2扩展卡 +- 1x T1扩展卡 +- 1x T1升级 +- 1x T2升级 + +T2无人机箱可以带这些: +- 1x T2 [CPU](cpu1.md) +- 2x T2 [内存](ram1.md) +- 1x [EEPROM](eeprom.md) +- 2x T2扩展卡 +- 1x T1升级 +- 1x T2升级 +- 1x T3升级 + +T4无人机箱可以带这些: +- 1x T3 [CPU](cpu3.md) +- 2x T3 [RAM](ram5.md) +- 1x [EEPROM](eeprom.md) +- 3x T3扩展卡 +- 9x T3升级 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase2.md new file mode 100644 index 000000000..702933ee7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCase2.md @@ -0,0 +1 @@ +#REDIRECT droneCase1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCaseCreative.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCaseCreative.md new file mode 100644 index 000000000..702933ee7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/droneCaseCreative.md @@ -0,0 +1 @@ +#REDIRECT droneCase1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/eeprom.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/eeprom.md new file mode 100644 index 000000000..ce36ff5fd --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/eeprom.md @@ -0,0 +1,6 @@ +# E2PROM + +![Let's get this party started.](oredict:oc:eeprom) + +包含了电脑的启动代码,相当于BIOS,数据存储于raw 字节数组,需要编译烧写 +E2PROM 被用于电脑的开机启动 [无人机](drone.md) 和 [单片机](../block/microcontroller.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/experienceUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/experienceUpgrade.md new file mode 100644 index 000000000..6597a5bb9 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/experienceUpgrade.md @@ -0,0 +1,9 @@ +# 经验升级 + +![This makes no sense, but it's cool.](oredict:oc:experienceUpgrade) + +允许 [机器人](../block/robot.md) and [无人机](drone.md) 通过杀死怪物和挖矿收经验,每个升级存30级经验, 并且每一级都有加成,例如挖矿加速 + +[机器人](../block/robot.md) 10机得到金子, [robots](../block/robot.md)20级得到钻石 + +经验存在升级里面,认升级不认设备 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/floppy.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/floppy.md new file mode 100644 index 000000000..c2918a392 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/floppy.md @@ -0,0 +1,5 @@ +# 软盘 + +![Many inches.](oredict:oc:floppy) + +最便宜的存储设备了,用于早期交换数据 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/generatorUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/generatorUpgrade.md new file mode 100644 index 000000000..0956385d8 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/generatorUpgrade.md @@ -0,0 +1,10 @@ +# 发电机升级 + +![Generator X.](oredict:oc:generatorUpgrade) + +允许设备自主发电。 目前仅支持固体燃料比如煤. 内部有存储燃料的物品栏. 剩余的燃料可以用合适的组件API被拿走. 移除升级会使里面的东西掉出来 + +这个东西的效率比充电机低 + +所以还是用充电机好了 + diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard1.md new file mode 100644 index 000000000..3a41c2f62 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard1.md @@ -0,0 +1,5 @@ +# 显卡(GTX 690!) + +![Fancy images.](oredict:oc:graphicsCard1) + +对大多数计算机都非常重要[computers](../general/computer.md),显卡允许 [计算机](../general/computer.md)在连接的[屏幕](../block/screen1.md)显示字符. 有数个档次,如同屏幕那样支持多个分辨率 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard2.md new file mode 100644 index 000000000..2503631a4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard2.md @@ -0,0 +1 @@ +#REDIRECT graphicsCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard3.md new file mode 100644 index 000000000..2503631a4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/graphicsCard3.md @@ -0,0 +1 @@ +#REDIRECT graphicsCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md new file mode 100644 index 000000000..291049ed2 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md @@ -0,0 +1,5 @@ +# 硬盘驱动器 + +![Spaaaace.](oredict:oc:hdd1) + +熟悉的存储器,存储速度一样,档次决定空间大小,有的机器只能用硬盘. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd2.md new file mode 100644 index 000000000..31a59d438 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd2.md @@ -0,0 +1 @@ +#REDIRECT hdd1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd3.md new file mode 100644 index 000000000..31a59d438 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd3.md @@ -0,0 +1 @@ +#REDIRECT hdd1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md new file mode 100644 index 000000000..26a5b6885 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md @@ -0,0 +1,9 @@ +# 悬浮鞋子 + +![Step on it.](oredict:oc:hoverBoots) + +如果不想去编程 [无人机](drone.md), 有个变通的办法: 踏脚石! + +鞋子有个特点: 只要有能量你就能跳得更高, 然后吸收落地的冲击力. 意思是你可以跳上4格子高然后将落地的冲击降到30%,也就是说你可以在4格子高跳下而不掉血. + +可以通过[充电机](../block/charger.md) ,AE2 充电器,工业充电盒子,或者是TE的充电器来充能, 靴子可以任意用染料染色 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md new file mode 100644 index 000000000..406ae4332 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md @@ -0,0 +1,16 @@ +# 悬浮升级 + +![Float like a feather.](oredict:oc:hoverUpgrade1) + +允许 [机器人](../block/robot.md) 飞得更高. 缺省状态下机器人只能往上走8格子. 平常因为这足够爬墙所以这足够了. +规律是这样的: +- 机器人只会在起点和终点都有效的情况下才会动 (e.g.允许搭桥). +- 机器人下方的位置永远有效(也就是说任何时候都可以往下走). +- 一个固体方块上方的飞行上限内的格子都是有效的 +- 拥有正对当前位置相邻的表面的点是有效的 (允许爬墙). + +这几个规则演示一下就是这样: + +![Robot movement rules visualized.](opencomputers:doc/img/robotMovement.png) + +如果不想被地球引力限制就安一个吧 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade2.md new file mode 100644 index 000000000..bad6728c9 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade2.md @@ -0,0 +1 @@ +#REDIRECT hoverUpgrade1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md new file mode 100644 index 000000000..446690ba3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md @@ -0,0 +1,97 @@ +# Items + +This index lists all of the documented items in OpenComputers. If you're looking for a block, check out the [block index](../block/index.md) instead. + +Keep in mind that some of these may not be available, depending on the recipe set used. + +## Tools +* [分析仪](analyzer.md) +* [手册](manual.md) +* [远控终端](terminal.md) +* [纹理拾取器](texturePicker.md) +* [扳手](wrench.md) + +## Devices +* [无人机](drone.md) +* [服务器](server1.md) +* [平板](tablet.md) + +## Components + +### Cards +* [抽象总线卡](abstractBusCard.md) +* [数据卡](dataCard1.md) +* [调试卡(创造)](debugCard.md) (aka AMI) +* [显卡](graphicsCard1.md) +* [因特网卡](internetCard.md) +* [连接卡](linkedCard.md) +* [网卡](lanCard.md) +* [红石卡](redstoneCard1.md) +* [无线网卡](wlanCard.md) +* [世界传感器卡](worldSensorCard.md) + +### Upgrades +* [天使升级](angelUpgrade.md) +* [电池升级](batteryUpgrade1.md) +* [卡槽升级](cardContainer1.md) +* [区块加载升级](chunkloaderUpgrade.md) +* [合成升级](craftingUpgrade.md) +* [数据库升级](databaseUpgrade1.md) +* [经验升级](experienceUpgrade.md) +* [发电机升级](generatorUpgrade.md) +* [悬浮升级](hoverUpgrade1.md) +* [物品栏控制器升级](inventoryControllerUpgrade.md) +* [物品栏升级](inventoryUpgrade.md) +* [拴绳升级](leashUpgrade.md) +* [MFU](mfu.md) +* [导航升级](navigationUpgrade.md) +* [活塞升级](pistonUpgrade.md) +* [告示牌升级](signUpgrade.md) +* [太阳能发电机升级](solarGeneratorUpgrade.md) +* [储罐控制升级](tankControllerUpgrade.md) +* [储罐升级](tankUpgrade.md) +* [牵引光束升级](tractorBeamUpgrade.md) +* [交易升级](tradingUpgrade.md) +* [升级箱](upgradeContainer1.md) + +### Rack Mountables +* [软驱](diskDriveMountable.md) +* [服务器](server1.md) +* [终端服务器](terminalServer.md) + +### Other +* [APU](apu1.md) +* [组件总线](componentBus1.md) +* [CPU](cpu1.md) +* [E2PROM](eeprom.md) +* [软盘](floppy.md) +* [硬盘驱动器](hdd1.md) +* [内存](ram1.md) + +## Crafting +* [酸液](acid.md) +* [逻辑运算单元](alu.md) +* [方向键](arrowKeys.md) +* [按钮组](buttonGroup.md) +* [卡片](card.md) +* [电路板](circuitBoard.md) +* [控制单元](controlUnit.md) +* [剥过的线](cuttingWire.md) +* [磁盘](disk.md) +* [Interweb](interweb.md) +* [微芯片](chip1.md) +* [数字键](numPad.md) +* [印刷电路板](printedCircuitBoard.md) +* [粗电路板](rawCircuitBoard.md) +* [晶闸管](transistor.md) + +## Assembling / Printing +* [油墨](chamelium.md) +* [墨盒](inkCartridge.md) +* [无人机箱](droneCase1.md) +* [微控制器箱](microcontrollerCase1.md) +* [平板壳子](tabletCase1.md) + +## Other +* [悬浮鞋](hoverBoots.md) +* [纳米机械](nanomachines.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridge.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridge.md new file mode 100644 index 000000000..e4d65d9ea --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridge.md @@ -0,0 +1,5 @@ +# Ink Cartridge + +![The colors of the rainbow.](oredict:oc:inkCartridge) + +墨盒为 [3D printers](../block/printer.md)供墨. 可以用染料来加满, 不过不是太方便. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridgeEmpty.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridgeEmpty.md new file mode 100644 index 000000000..2895df3c8 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inkCartridgeEmpty.md @@ -0,0 +1 @@ +#REDIRECT inkCartridge.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/internetCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/internetCard.md new file mode 100644 index 000000000..b8e2f6dd5 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/internetCard.md @@ -0,0 +1,7 @@ +# 因特网卡 + +![Cat videos in 3, 2, ...](oredict:oc:internetCard) + +使得 [电脑](../general/computer.md) 能够向因特网发送请求,包括Http和tcp客户端套接字。 + +安装因特网卡会向电脑安装一批网络应用, 比如pastebin命令,通过神秘代码安装网上大神的软件,或者是wget,下载特定URL的文件。 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/interweb.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/interweb.md new file mode 100644 index 000000000..235ecb277 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/interweb.md @@ -0,0 +1,5 @@ +# Interweb + +![A website is a place where there's cobweb.](oredict:oc:materialInterweb) + +用于长距离通信. 常用于 [因特网卡](internetCard.md) 和 [链接卡](linkedCard.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryControllerUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryControllerUpgrade.md new file mode 100644 index 000000000..54b6f7069 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryControllerUpgrade.md @@ -0,0 +1,9 @@ +# Inventory Controller + +![I'm in control.](oredict:oc:inventoryControllerUpgrade) + +物品栏控制器为[机器人](../block/robot.md) 和 [无人机](drone.md)提供了额外的物品栏交互能力. 允许在丢下或者捡起物品时显式指定一个外部的物品栏. 允许设备读取详细的物品信息. 最后他还给 [机器人](../block/robot.md) 添加了一个不借助外力更换自身装备的途径. + +可以被放在 [适配器](../block/adapter.md), 为[适配器](../block/adapter.md) 提供了探测相邻方块的物品的能力. 但是不能捡起或者丢出物品。 + +另见: [转置器](../block/transposer.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryUpgrade.md new file mode 100644 index 000000000..7c7c60ea4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/inventoryUpgrade.md @@ -0,0 +1,7 @@ +# Inventory Upgrade + +![Where does it keep all this stuff...](oredict:oc:inventoryUpgrade) + +物品栏升级使得[机器人](../block/robot.md) 和 [无人机](drone.md)拥有了物品栏. 每个升级为 [机器人](../block/robot.md) 提供16个槽位, 最大扩展到64; 为[无人机](drone.md) 提供4个槽位, 最大扩展到8. + +如果不安装这个东西,那么他们就无法捡起或者丢掉物品 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/lanCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/lanCard.md new file mode 100644 index 000000000..9802a811e --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/lanCard.md @@ -0,0 +1,5 @@ +# Network Card + +![Enter the network.](oredict:oc:lanCard) + +网卡允许 [电脑](../general/computer.md) 在本地网络内收发消息. 消息(或者封包) 可向子网广播, 或者是投送至特定的网络地址. [中继器](../block/relay.md) 可以用来桥接不同的子网,使之互相通信. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/leashUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/leashUpgrade.md new file mode 100644 index 000000000..c3d899538 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/leashUpgrade.md @@ -0,0 +1,5 @@ +# Leash Upgrade + +![-redacted- ~ Vexatos 2015](oredict:oc:leashUpgrade) + +拴绳升级允许无人机和机器人去牵引生物。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/linkedCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/linkedCard.md new file mode 100644 index 000000000..429cb1035 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/linkedCard.md @@ -0,0 +1,5 @@ +# Linked Card + +![I feel we some kind of connection.](oredict:oc:linkedCard) + +链接卡是特化的[网卡](lanCard.md). 只能成对使用,用来提供P2P通讯. 可以跨维度无限制距离通讯(只要能创造环境的话). \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/manual.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/manual.md new file mode 100644 index 000000000..d6052b2d0 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/manual.md @@ -0,0 +1,17 @@ +# Manual + +![A good read.](oredict:oc:manual) + +嗯,这是OC手册,就像是读wiki一样 + +左键点击链接可以导航到对应位置,跳跃或者右击返回上一级,Esc退出 + +由loveyanbei(https://github.com/loveyanbei) 汉化 + +如果有问题可以访问 http://ocdoc.cil.li 查看wiki + +对翻译有疑问可以自行pull request + +如果mod有bug,可到bug tracker 提问 https://github.com/MightyPirates/OpenComputers/issues + +![Your new best friend.](opencomputers:doc/img/manual.png) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md new file mode 100644 index 000000000..65571a407 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md @@ -0,0 +1,7 @@ +# MFU + +![You will never know the true meaning of this acronym.](oredict:oc:mfu) + +此升级提供了一个远程的 [适配器](../block/adapter.md). 在任意方块边上蹲下并右键都会把它绑定到特定位置. 然后放到附近的适配器里面 (这个附近很有限) 然后适配器就会像刚好在你绑定的那个边上放着那样工作(一般的适配器要挨着,这里隔了一点距离)! + +记住,保持远程适配器链接需要能量. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase1.md new file mode 100644 index 000000000..4a2930e4a --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase1.md @@ -0,0 +1,31 @@ +# Microcontroller Case + +![It's so cute.](oredict:oc:microcontrollerCase1) + +微控制器盒是建造[单片机](../block/microcontroller.md) 的基础. [单片机](../block/microcontroller.md) 是极其简化的 [电脑](../general/computer.md). 只有少量组件,并被设计为特定用途, 比如转发或者处理红石信号, 以及处理网路消息. + +它没有文件系统. 所有程序都被烧写进了[E2PROMPROM](eeprom.md).这个芯片可以通过和一个微控制器合成来替换[microcontrollers](../block/microcontroller.md),旧的会返还. + +单片机的能源消耗很小. + +T1单片机配件: +- 1x T1 [CPU](cpu1.md) +- 1x T1 [内存](ram1.md) +- 1x [E2PROM](eeprom.md) +- 2x T1扩展卡 +- 1x T2升级 + +T2单片机配件: +- 1x T1 [CPU](cpu1.md) +- 2x T1 [RAM](ram1.md) +- 1x [E2PROM](eeprom.md) +- 1x T2扩展卡 +- 1x T1扩展卡 +- 1x T2升级 + +T3单片机配件: +- 1x T3 [CPU](cpu3.md) +- 2x T3 [内存](ram5.md) +- 1x [E2PROM](eeprom.md) +- 3x T3扩展卡 +- 9x T3升级 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase2.md new file mode 100644 index 000000000..d3a9af68d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCase2.md @@ -0,0 +1 @@ +#REDIRECT microcontrollerCase1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCaseCreative.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCaseCreative.md new file mode 100644 index 000000000..d3a9af68d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/microcontrollerCaseCreative.md @@ -0,0 +1 @@ +#REDIRECT microcontrollerCase1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/nanomachines.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/nanomachines.md new file mode 100644 index 000000000..c39f02dea --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/nanomachines.md @@ -0,0 +1,34 @@ +# 纳米机械 + +![Nanomachines, son.](oredict:oc:nanomachines) + +这些小机械可以让你变得更快更高更强,或者干掉你. 有时候这些是同时的! 纳米机械往他们寄生的玩家身上添加buff和debuff. 吃下他们就可以安装了! + +安装以后你的屏幕上会显示出这些机械还有多少能源运作. 站在[充电机](../block/charger.md)附近就可以充电.装的机器越多,能耗越大. + +纳米机器提供了特定数量可以被玩家触发的输入,效果从玩家周身的粒子效果到药水效果选择,以至于更多奇怪的功能。 + +触发那些输入取决于当前纳米机器的配置, 每次配置时,实际的连接情况是随机的. 这意味着你要尝试启用不同的输入来验证他们做了什么. 如果对你的配置不满, 你可以吃下一批新的机器重新配置. 如果你要完全清掉纳米机器,喝点 [酸液](acid.md). 注意一次启用过多输入会给你带来debuff! + +缺省情况下纳米机器是待机状态. 你要用无线消息来控制, 因此很有必要带一个安了无线网卡的[平板](tablet.md). 纳米机器只会对两格子内机器发出的信号有反应, 不限端口不限机器! + +纳米机器使用一套简单的协议: 每个封包必须包含数个部分, 第一部分称为"header" 并且必须是 `nanomachines`这个字符串. 第二部分是命令名. 其他部分是命令参数. 以下命令可用,格式为 `commandName(arg1, ...)`: + +- `setResponsePort(port:number)` - 设定纳米机器响应的端口,命令的响应在此接受. +- `getPowerState()` - 返回当前能量和最大值. +- `getHealth()` - 返回当前玩家的生命. +- `getHunger()` - 返回当前玩家的饥饿值. +- `getAge()` - 返回当前玩家的存活时间(秒) +1s. +- `getName()` - 返回玩家的名字. +- `getExperience()` - 返回玩家的经验数量. +- `getTotalInputCount()` - 返回可用输入端口总数. +- `getSafeActiveInputs()` - 返回安全的输入端口总数. +- `getMaxActiveInputs()` - 返回活动输入数量最大值. +- `getInput(index:number)` - 得到对应索引值处的输入状态. +- `setInput(index:number, value:boolean)` - 设定对应索引处的输入状态. +- `getActiveEffects()` - 返回活动的纳米机器作用列表. 注意部分效果是不显示的. +- `saveConfiguration()` - 返回物品栏里面的纳米机器, 将会把当前的配置存到他们里面. + +OpenOS用例: +- `component.modem.broadcast(1, "nanomachines", "setInput", 1, true)` 将启用第一输入. +- `component.modem.broadcast(1, "nanomachines", "getHealth")` 将得到玩家的血量. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/navigationUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/navigationUpgrade.md new file mode 100644 index 000000000..ca3820f49 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/navigationUpgrade.md @@ -0,0 +1,9 @@ +# Navigation Upgrade + +![I'm lost. Again.](oredict:oc:navigationUpgrade) + +导航升级返回机器的位置和朝向. 坐标是相对用于合成这个升级的地图的中心而言的, 他的作用范围也限制在哪块地图的大小上面. + +内部地图可以通过重新合成来更新,旧地图返还. + +推荐与 [路径点](../block/waypoint.md)配合食用. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/numPad.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/numPad.md new file mode 100644 index 000000000..8e8ff44be --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/numPad.md @@ -0,0 +1,5 @@ +# Numeric Keypad + +![Check for fingerprints.](oredict:oc:materialNumPad) + +数字键是 [键盘](../block/keyboard.md).的配件,允许输入数字. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/pistonUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/pistonUpgrade.md new file mode 100644 index 000000000..6465ac9eb --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/pistonUpgrade.md @@ -0,0 +1,7 @@ +# Piston Upgrade + +![Push it.](oredict:oc:pistonUpgrade) + +活塞升级让设备的行为变得像原版活塞那样. 安装后, 一个叫`push()`的函数可用. 调用时设备将会向面对的方向推出去. [机器人](../block/robot.md) 和 [单片机](../block/microcontroller.md)是方块的前方这个面; 对于[平板](tablet.md)是玩家的面对方向. + +推方块的行为遵循原版活塞. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/printedCircuitBoard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/printedCircuitBoard.md new file mode 100644 index 000000000..e617d46cb --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/printedCircuitBoard.md @@ -0,0 +1,5 @@ +# Printed Circuit Board + +![AKA PCB](oredict:oc:materialCircuitBoardPrinted) + +电路板和 [晶体管](transistor.md)一样, 都是基础合成材料. 用于制作多种元件, [卡片](card.md) 和大量的[方块](../block/index.md). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram1.md new file mode 100644 index 000000000..4d1278a0d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram1.md @@ -0,0 +1,17 @@ +# Memory + +![Do you remember, dancing in September~](oredict:oc:ram1) + +内存和 [CPU](cpu1.md)一样都是[电脑](../general/computer.md)的核心部件. 根据 [CPU](cpu1.md)的架构, 内存决定了于电脑能做什么,不能做什么.以标准LUA为例, 内存条控制了脚本最大分配多少存储空间.这意味着你要安装更大的内存条跑更大的程序. + +缺省状态下内存条的规格: +- T1: 192KB +- T1.5: 256KB +- T2: 384KB +- T2.5: 512KB +- T3: 768KB +- T3.5: 1024KB + +仅对LUA架构有效 + +此容量可以在配置修改 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram2.md new file mode 100644 index 000000000..94679a04e --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram2.md @@ -0,0 +1 @@ +#REDIRECT ram1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram3.md new file mode 100644 index 000000000..94679a04e --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram3.md @@ -0,0 +1 @@ +#REDIRECT ram1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram4.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram4.md new file mode 100644 index 000000000..94679a04e --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram4.md @@ -0,0 +1 @@ +#REDIRECT ram1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram5.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram5.md new file mode 100644 index 000000000..94679a04e --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram5.md @@ -0,0 +1 @@ +#REDIRECT ram1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram6.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram6.md new file mode 100644 index 000000000..94679a04e --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/ram6.md @@ -0,0 +1 @@ +#REDIRECT ram1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/rawCircuitBoard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/rawCircuitBoard.md new file mode 100644 index 000000000..5d1f811e0 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/rawCircuitBoard.md @@ -0,0 +1,5 @@ +# Raw Circuit Board + +![Not sushi.](oredict:oc:materialCircuitBoardRaw) + +粗电路板,中间合成材料, 用来合成 [电路板](circuitBoard.md) (或者是 [印刷电路板](printedCircuitBoard.md)). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard1.md new file mode 100644 index 000000000..91771c907 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard1.md @@ -0,0 +1,9 @@ +# Redstone Card + +![Seeing red.](oredict:oc:redstoneCard1) + +红石卡让[电脑](../general/computer.md) 可以读写相邻方块的红石信号.输入信号变化时, 信号将输入[电脑](../general/computer.md). + +如果有mod可以提供多个红石信号捆绑同时传递的能力, 如Redlogic,MFR,Redpower; 或者是提供了无线红石传递的mod,比如 WR-CBE,或者Slimevoid's Wireless,那么将有一个二级红石卡来处理和他们的通讯. + +输入面是相对于机箱,机器人,机架自身的,也就是说,当你站在电脑的前面(正面)的时候,`sides.right` 指的是你左边(你面对的方向左边). diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard2.md new file mode 100644 index 000000000..7480d5267 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/redstoneCard2.md @@ -0,0 +1 @@ +#REDIRECT redstoneCard1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/server1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/server1.md new file mode 100644 index 000000000..bce7ffaec --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/server1.md @@ -0,0 +1,39 @@ +# Server + +![Serves u right.](oredict:oc:server1) + +服务器是高级 [电脑](../general/computer.md). 可以通过把物品拿在手上并使用来配置, 就像打开背包和箱子一样,也可以放在[机架](../block/rack.md)里面,通过站在机架的“正面”并激活它来配置. 参见[机架](../block/rack.md) entry. + +T1服务器配置: +- 1x T2 [CPU](cpu2.md) +- 2x T2 [内存](ram3.md) +- 2x T2 [硬盘](hdd2.md) +- 1x T2 [组件总线](componentBus2.md) +- 2x T2 扩展卡 +- 1x [E2PROM](eeprom.md) + +T2服务器配置: +- 1x T3 [CPU](cpu3.md) +- 3x T3 [内存](ram5.md) +- 3x T3 [硬盘](hdd3.md) +- 2x T3 [组件总线](componentBus3.md) +- 2x T2扩展卡 +- 1x T3扩展卡 +- 1x [E2PROM](eeprom.md) + +T3服务器配置: +- 1x T3 [CPU](cpu3.md) +- 4x T3 [内存](ram5.md) +- 4x T3 [硬盘](hdd3.md) +- 3x T3 [组件总线](componentBus3.md) +- 2x T2扩展卡 +- 2x T3扩展卡 +- 1x [E2PROM](eeprom.md) + +T4服务器配置: +- 1x T3 [CPU](cpu3.md) +- 4x T3 [内存](ram5.md) +- 4x T3 [硬盘](hdd3.md) +- 3x T3 [组件总线](componentBus3.md) +- 4x T3扩展卡 +- 1x [E2PROM](eeprom.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/server2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/server2.md new file mode 100644 index 000000000..d02b2f850 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/server2.md @@ -0,0 +1 @@ +#REDIRECT server1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/server3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/server3.md new file mode 100644 index 000000000..d02b2f850 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/server3.md @@ -0,0 +1 @@ +#REDIRECT server1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/serverCreative.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/serverCreative.md new file mode 100644 index 000000000..d02b2f850 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/serverCreative.md @@ -0,0 +1 @@ +#REDIRECT server1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/signUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/signUpgrade.md new file mode 100644 index 000000000..fcf21f5c3 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/signUpgrade.md @@ -0,0 +1,5 @@ +# Sign I/O + +![I see the signs on the wall.](oredict:oc:signUpgrade) + +允许设备和告示牌交互. 可以读取牌子的信息,改变牌子的信息. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/solarGeneratorUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/solarGeneratorUpgrade.md new file mode 100644 index 000000000..3ddf67b14 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/solarGeneratorUpgrade.md @@ -0,0 +1,5 @@ +# Solar Generator + +![Walking on the sun.](oredict:oc:solarGeneratorUpgrade) + +太阳能发电机升级可以安装到[机器人](../block/robot.md), [无人机](drone.md) 和 [平板](tablet.md) 上面. 只会在阳光直射的时候工作; 设备被天气影响或者处于封闭空间时是不工作的,能量产生速度很慢 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md new file mode 100644 index 000000000..ce86619f6 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md @@ -0,0 +1,13 @@ +# Tablet + +![Touch me if you can.](item:OpenComputers:item@68) + +通过将[平板外壳](tabletCase1.md)放到[组装机](../block/assembler.md), 来配置并组装平板. 平板是一种小巧的,无法直接交互世界的电脑,比如[基础红石卡](redstoneCard1.md)就没法用. 不过另一批就可以,比如 [告示牌升级](signUpgrade.md),[活塞升级](pistonUpgrade.md). + +T2平板允许安装一个物品栏升级. 可以通过蹲下+右键打开平板UI访问, 此时平板将强制关机. + +不像电脑,平板不能保持状态,比如玩家拿着平板,退出,重进,平板退出前的状态是不会保留的,必须关闭平板. 跨维度也不可以,比如去地狱再会来,运行状态会丢失. + +可以放在 [充电机](../block/charger.md) 补充能量, 电脑可以通过连接的充电机访问平板的第一硬盘,此时充电机就像软驱,平板起了软盘的作用. 当你不小心搞坏了平板的系统的时候这很有用。 + +另一个高级用法是通过在一个方块上使用约一秒(长按右键)发射特定方块相关的信号,会有一声蜂鸣通知你信号被发射,仅在安装了信号发射相关升级时可用。 比如[地形分析器](../block/geolyzer.md) 会添加方块信息,如硬度, [导航升级](navigationUpgrade.md) 会添加方块相对于拿着平板的玩家的坐标信息. 拿着平板的时候,这样的方块会被高亮标记。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase1.md new file mode 100644 index 000000000..0d16fdc7d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase1.md @@ -0,0 +1,39 @@ +# Tablet Case + +![Doesn't bend.](oredict:oc:tabletCase1) + +在[装配机](../block/assembler.md)制作 [平板](tablet.md) 的基本物件. [平板](tablet.md)是袖珍的 [电脑](../general/computer.md). 可以享受少量升级, 但无法像 [机箱](../block/case1.md) 那样简单的使用红石卡和网卡和世界交互 + +不能被平板使用的升级和卡[tablets](tablet.md)都放不进 [组装机](../block/assembler.md). 如果能放进 [组装机](../block/assembler.md), 他就能通过组件api使用. + +在玩家物品栏的平板会保持允许. 丢下或者放到其他地方, 会在一段时间后关闭. + +T1配件: +- 1x [CPU (T 2)](cpu2.md) +- 2x [内存 (T 2)](ram3.md) +- 1x [硬盘 (T 2)](hdd2.md) +- 2x 扩展卡 (T 2) +- 1x [EEPROM](eeprom.md) +- 1x 升级 (T 1) +- 1x 升级 (T 2) +- 1x 升级 (T 3) + +T2配件: +- 1x [CPU (T 3)](cpu3.md) +- 2x [内存 (T 2)](ram3.md) +- 1x [硬盘 (T 2)](hdd2.md) +- 1x Expansion card (T 2) +- 1x Expansion card (T 3) +- 1x [EEPROM](eeprom.md) +- 2x 升级 (T 2) +- 1x 升级 (T 3) +- 1x [升级](upgradeContainer2.md) or [卡槽](cardContainer2.md) (T 2) + +T4配件: +- 1x [CPU (T 3)](cpu3.md) +- 2x [内存 (T 3)](ram5.md) +- 1x [硬盘 (T 3)](hdd3.md) +- 3x 扩展卡 (T 3) +- 1x [EEPROM](eeprom.md) +- 9x 升级 (T 3) +- 1x [升级](upgradeContainer3.md) or [卡槽](cardContainer3.md) (T 3) \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase2.md new file mode 100644 index 000000000..325fd0f57 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCase2.md @@ -0,0 +1 @@ +#REDIRECT tabletCase1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCaseCreative.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCaseCreative.md new file mode 100644 index 000000000..325fd0f57 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tabletCaseCreative.md @@ -0,0 +1 @@ +#REDIRECT tabletCase1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tankControllerUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tankControllerUpgrade.md new file mode 100644 index 000000000..e734f31ee --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tankControllerUpgrade.md @@ -0,0 +1,9 @@ +# Tank Controller + +![Fluid routing.](oredict:oc:tankControllerUpgrade) + +储罐控制器可以控制储罐. 允许查询内部储罐和外部(比如岩浆发电机,UU机,BC罐子). + +可以被安放在 [适配器](../block/adapter.md),允许连接的[电脑](../general/computer.md)查询相邻的储罐信息 + +参见: [转置器](../block/transposer.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tankUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tankUpgrade.md new file mode 100644 index 000000000..362775b12 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tankUpgrade.md @@ -0,0 +1,5 @@ +# Tank Upgrade + +![Suck it.](oredict:oc:tankUpgrade) + +储罐升级允许设备存储液体. 每个升级仅能存储一个类型的物品, 提供16桶容量(16000mB). [机器人](../block/robot.md) 和 [无人机](drone.md) 可以从世界中和其他储罐汲取液体, 也可以放回世界或者储罐. 单个设备的储罐数没有限制. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md new file mode 100644 index 000000000..430e1eab5 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md @@ -0,0 +1,9 @@ +# Remote Terminal + +![Remote access.](oredict:oc:terminal) + +终端提供了对 [终端服务器](terminalServer.md)的远程访问. 激活一台在机架安装的[终端服务器](terminalServer.md), 选择要绑定到终端的服务器即可. + +[终端服务器](terminalServer.md) 提供了[虚拟屏幕](../block/screen1.md) 和[虚拟键盘](../block/keyboard.md)(类似于openssh server),可以通过终端访问. 注意不要将实体键盘和屏幕连接到终端服务器所在的子网,否则发生的事情是未定义行为. 使用绑定了的终端后,一个和电脑连接屏幕和键盘一样的界面会打开,你在这个GUI做的事情将会被反馈到远程的机器 + +多个终端可以被绑定到同一个[终端服务器](terminalServer.md), 但是他们共享显示和输入,这是和sshd不同的地方. [终端服务器](terminalServer.md) 只能绑定有限数量的终端. 达到上限后,继续绑定会踢出最先绑定的终端. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminalServer.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminalServer.md new file mode 100644 index 000000000..26b5e2f06 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminalServer.md @@ -0,0 +1,5 @@ +# Terminal Server + +![Remote Viewing](oredict:oc:terminalServer) + +向外界提供虚拟屏幕和键盘,可以通过绑定终端来控制机器,必须安装在机架里面。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/texturePicker.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/texturePicker.md new file mode 100644 index 000000000..32ce3d2c4 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/texturePicker.md @@ -0,0 +1,5 @@ +# Texture Picker + +![What do you mean, it's just a re-skin?](oredict:oc:texturePicker) + +纹理拾取器用于制作3d打印的模型 [3D printer](../block/printer.md). 可以通过蹲下+右键拾取世界中方块使用的纹理, 注意: 某些渲染特殊的方块,比如箱子,不起作用。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tractorBeamUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tractorBeamUpgrade.md new file mode 100644 index 000000000..7e5f5aae2 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tractorBeamUpgrade.md @@ -0,0 +1,5 @@ +# Tractor Beam + +![Beam me up.](oredict:oc:tractorBeamUpgrade) + +牵引光束升级允许设备捡起3格内的物品. 对农场里面的[机器人](../block/robot.md)十分有用,当机器人使用范围挖掘工具时效果也很明显. 每次操作都会耗费能量. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tradingUpgrade.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tradingUpgrade.md new file mode 100644 index 000000000..9c0fac206 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tradingUpgrade.md @@ -0,0 +1,5 @@ +# Trading Upgrade + +![Equivalent Exchange](oredict:oc:tradingUpgrade) + +交易升级允许自动和商人交易,可以被放在[机器人](../block/robot.md)和[无人机](drone.md)里面,能够探测附近商人的存在,知道自己可以卖什么并完成交易。 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/transistor.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/transistor.md new file mode 100644 index 000000000..f0fe4b467 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/transistor.md @@ -0,0 +1,5 @@ +# Transistor + +![I think I've used up all my references.](oredict:oc:materialTransistor) + +晶体管是基本合成材料,主要用于合成 [芯片](chip1.md)等电子产品. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer1.md new file mode 100644 index 000000000..aa8f3a65b --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer1.md @@ -0,0 +1,5 @@ +# Upgrade Container + +![Can haz upgrade.](oredict:oc:upgradeContainer1) + +升级箱为[机器人](../block/robot.md)提供额外的升级槽位. 其升级幅度由升级箱规格而定,会双倍增加机器人的复杂度 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer2.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer2.md new file mode 100644 index 000000000..408c907f9 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer2.md @@ -0,0 +1 @@ +#REDIRECT upgradeContainer1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer3.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer3.md new file mode 100644 index 000000000..408c907f9 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/upgradeContainer3.md @@ -0,0 +1 @@ +#REDIRECT upgradeContainer1.md \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md new file mode 100644 index 000000000..3a52941e8 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md @@ -0,0 +1,7 @@ +# WLAN Card + +![May cause cancer. May not.](oredict:oc:wlanCard) + +无线网卡是 [网卡](lanCard.md) 的升级, 添加了收发无线信号的能力。无线信号发射强度决定了信息可以传多远, 信号强度等于方块距离. + +强度越高发射所需能量越大. 地形也会干扰到发送过程. 信号强度 - 方块硬度 > 0 时,信号可以穿透方块,并且强度将衰减到 信号强度 - 方块硬度,空气硬度是1,当强度下降到0时,目标将不会收到信号. 通常你需要保证发送和接受之间的连线是净空的. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/worldSensorCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/worldSensorCard.md new file mode 100644 index 000000000..6707c0981 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/worldSensorCard.md @@ -0,0 +1,5 @@ +# World Sensor Card + +![To boldly go...](oredict:oc:worldSensorCard) + +世界传感器卡允许读取大气,重力等世界信息,通常用于加入了星系mod的情况,用于调节在空间内工作的机器人 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/wrench.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wrench.md new file mode 100644 index 000000000..accac8b1d --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wrench.md @@ -0,0 +1,5 @@ +# Scrench + +![Made in Swiss.](oredict:oc:wrench) + +扳手 => 融合了螺丝刀和普通扳手的功能,可以拿来旋转方块 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt b/src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt new file mode 100644 index 000000000..69621d6a0 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt @@ -0,0 +1,13 @@ +#blocks/robot.md +blocks/waypoint.md +blocks/print.md +blocks/relay.md +items/terminal.md +items/tablet.md +items/wlancard.md +items/cardcontainer.md +items/hoverupgrade.md +items/mfu.md +items/hdd.md +items/hoverboot.md +general/quickstart.md \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/client/gui/Manual.scala b/src/main/scala/li/cil/oc/client/gui/Manual.scala index 02a3cc9eb..b1bb780da 100644 --- a/src/main/scala/li/cil/oc/client/gui/Manual.scala +++ b/src/main/scala/li/cil/oc/client/gui/Manual.scala @@ -57,7 +57,7 @@ class Manual extends GuiScreen with traits.Window { } def refreshPage(): Unit = { - val content = Option(api.Manual.contentFor(ManualAPI.history.top.path)). + val content = Option(api.Manual.contentFor(ManualAPI.history.top.path)). getOrElse(asJavaIterable(Iterable("Document not found: " + ManualAPI.history.top.path))) document = Document.parse(content) documentHeight = Document.height(document, documentMaxWidth, fontRendererObj) diff --git a/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala b/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala index 07ad82e7a..857979117 100644 --- a/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala +++ b/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala @@ -61,7 +61,15 @@ trait BasicTextSegment extends Segment { if (width >= maxWidth) { if (lastBreak > 0 || fullWidth <= maxLineWidth || s.exists(breaks.contains)) if (maxWidth == maxLineWidth && fullWidth == maxLineWidth && !s.exists(breaks.contains)) return s.length - else return lastBreak + 1 + else if(lastBreak == -1) + { + //lastbreak = -1, then return pos - 1 + //if return lastBreak + 1,we will run into infinite loop + return pos - 1 + } + else { + return lastBreak + 1 //if we got a long sentence without breaks ,lastbreak still -1 + } else return pos - 1 } if (pos < s.length && breaks.contains(s.charAt(pos))) lastBreak = pos From e43225f5cbca049376d009e48b5d44e7326f5eaf Mon Sep 17 00:00:00 2001 From: 45210 <452104285@qq.com> Date: Wed, 24 May 2017 14:29:31 +0800 Subject: [PATCH 06/37] Adding zh_CN localization of OpenComputers Manual,and fix of infinite loop in calculating nextY --- .../assets/opencomputers/doc/zh_CN/无效文件.txt | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt b/src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt deleted file mode 100644 index 69621d6a0..000000000 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/无效文件.txt +++ /dev/null @@ -1,13 +0,0 @@ -#blocks/robot.md -blocks/waypoint.md -blocks/print.md -blocks/relay.md -items/terminal.md -items/tablet.md -items/wlancard.md -items/cardcontainer.md -items/hoverupgrade.md -items/mfu.md -items/hdd.md -items/hoverboot.md -general/quickstart.md \ No newline at end of file From eb69ee653951e0e1f87f5f81f9dda6a453d2f1b5 Mon Sep 17 00:00:00 2001 From: loveyanbei Date: Fri, 26 May 2017 12:36:53 +0800 Subject: [PATCH 07/37] Some Additional files --- .../opencomputers/doc/zh_CN/block/index.md | 20 ++++++------ .../opencomputers/doc/zh_CN/block/print.md | 6 ++-- .../opencomputers/doc/zh_CN/block/printer.md | 15 ++++----- .../opencomputers/doc/zh_CN/block/relay.md | 12 +++---- .../opencomputers/doc/zh_CN/block/screen1.md | 12 +++++-- .../opencomputers/doc/zh_CN/block/waypoint.md | 6 ++-- .../doc/zh_CN/general/quickstart.md | 32 +++++++++---------- .../assets/opencomputers/doc/zh_CN/index.md | 18 +++-------- .../doc/zh_CN/item/cardContainer1.md | 2 +- .../opencomputers/doc/zh_CN/item/hdd1.md | 2 +- .../doc/zh_CN/item/hoverBoots.md | 6 ++-- .../doc/zh_CN/item/hoverUpgrade1.md | 10 +++--- .../opencomputers/doc/zh_CN/item/index.md | 26 +++++++-------- .../opencomputers/doc/zh_CN/item/mfu.md | 4 +-- .../opencomputers/doc/zh_CN/item/tablet.md | 8 ++--- .../opencomputers/doc/zh_CN/item/terminal.md | 5 +-- .../opencomputers/doc/zh_CN/item/wlanCard.md | 4 +-- 17 files changed, 94 insertions(+), 94 deletions(-) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md index cf8a4e9e4..ccfe5f6ec 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/index.md @@ -1,27 +1,27 @@ -# Blocks +# 方块 本索引列出了OC全部的的方块 如果要找物品点[这里](../item/index.md). -Keep in mind that some of these may not be available, depending on the recipe set used. +注意有些方块由于合成表的原因,可能不可用. -## Computers +## 电脑 * [机箱](case1.md) * [单片机](microcontroller.md) * [机架](rack.md) * [机器人](robot.md) -## Components +## 组件 -### Input / Output +### 输入 / 输出 * [全息投影机](hologram1.md) * [键盘](keyboard.md) * [屏幕](screen1.md) -### Storage +### 存储 * [硬盘](diskDrive.md) * [磁盘阵列](raid.md) -### Extensions +### 扩展 * [适配器](adapter.md) * [扫描器](geolyzer.md) * [运动探测器](motionSensor.md) @@ -29,19 +29,19 @@ Keep in mind that some of these may not be available, depending on the recipe se * [转置器(注:直译)](transposer.md) * [路径点](waypoint.md) -## Assembly / Printing +## 组装 / 打印 * [3D打印](print.md) * [3D打印机](printer.md) * [组装器](assembler.md) * [染色方块](chameliumBlock.md) * [拆解器](disassembler.md) -## Networking +## 网络 * [线缆](cable.md) * [VLAN分割器](netSplitter.md) * [中继器](relay.md) -## Power management +## 电源管理 * [电容](capacitor.md) * [充电器](charger.md) * [能源转换](powerConverter.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md index 0f803aec6..b97f3e45d 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/print.md @@ -2,10 +2,10 @@ ![Any way you want me.](block:OpenComputers:print) -3D打印制品由 [3D打印机](printer.md)制造. 他们主要作为装饰用途出现, 但也可以用作收发红石信号来扩展出一点点小的功能. +3D打印制品由 [3D打印机](printer.md)制造. 他们主要作为装饰用途出现, 但也可以收发红石信号来扩展出一点点小的功能. 可以通过放入 [3D打印机](printer.md)进行回收. 可以重用一点用来打印的 [油墨](../item/chamelium.md). 打印的颜料是不会回收的. -长按shift(默认的OC扩展tip)会显示出当前打印制品的激活状态. +长按shift(默认的OC扩展tip),将会显示出当前打印制品的激活状态. -兼容Forge Multipart. 在他们不碰撞,且单个方块的形状数量不超出上限的情况下它们可以被放入单个方块的空间,比如火炬,拉杆,线缆等. +兼容Forge Multipart. 在他们不碰撞,且单个方块的形状数量不超出上限时,可以被放入单个方块的空间,比如火炬,拉杆,线缆等. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md index 3fdb09cae..2aa3f07f9 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/printer.md @@ -2,17 +2,16 @@ ![2D printing is so yesteryear.](oredict:oc:printer) -3D printers allow you to print any block of any shape, with any type of texture. To get started with 3D printers, you will need to place down a 3D printer block next to a computer. This will give access to the `printer3d` component API, allowing you to set up and print [models](print.md) using the provided functions. +3D打印机允许你在任何方块上,用任何纹理打印出你想要的样子.要打印东西, 需要在电脑边放一台打印机.`printer3d` 组件API将启用, 电脑将能够通过这些API,控制打印机打印出[模型](print.md). -A more convenient way to setup 3D printers is to use Open Programs Package Manager (OPPM). Once installed (`oppm install oppm`), make sure you have an [internet card](../item/internetCard.md) in your [computer](../general/computer.md) and run the following command: +用OPPM来设置打印机更方便. 一旦安装 (`oppm install oppm`), 确保你有 [因特网卡](../item/internetCard.md),并执行以下命令: `oppm install print3d-examples` -The examples can then be found in `/usr/share/models/` as .3dm files. Take a look through the example files for available options, in particular the `example.3dm` file. Alternatively, you can download the `print3d` and `print3d-examples` programs from OpenPrograms using `wget` and an [internet card](../item/internetCard.md). +示例将会在 `/usr/share/models/` 以.3dm的扩展名存在. 阅读示例文件以获取打印选项的信息, 尤其是这个 `example.3dm`. 你也可以通过安装了网卡的计算机,用wget从OpenProgram下载`print3d` and `print3d-examples`. -In order to be able to print the models, a 3D printer needs to be configured via a [computer](../general/computer.md). If set to print non-stop, the computer will no longer be required thereafter. You will also need to provide an [ink cartridge](../item/inkCartridge.md) and some [chamelium](../item/chamelium.md) as input materials. The amount of chamelium used depends on the volume of the 3D print, while the amount of ink used depends on the surface area of the printed item. +要打印模型, 需要通过 [电脑](../general/computer.md)配置打印机. 如果设置了循环打印, 开始任务后电脑就可以搬走了. 你还需要提供 [墨盒](../item/inkCartridge.md) , [油墨](../item/chamelium.md) 作为打印材料. 油墨用量和3D打印大小有关, 墨水取决于表面积. -To print an item, use the following command: -`print3d /path/to/file.3dm` -providing the path to the .3dm file. +打印需要以下命令: +`print3d /到打印文件的路径/文件.3dm` -Documentation pertaining to creating your own models can be found in `/usr/share/models/example.3dm`. +可以在 `/usr/share/models/example.3dm`.找到相关文档 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md index a309b8925..d57ae78f3 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/relay.md @@ -2,16 +2,16 @@ ![Building bridges.](oredict:oc:relay) -中继器允许子网间发送消息, 而不必把组件暴露给其他网络的 [电脑](../general/computer.md). 通常来说把组件限制在本地网络是个好主意(如果被不怀好意的熊控制了你的机器人,那么你家就完蛋了), +中继器允许子网间发送消息,而不把组件暴露给其他网络的[电脑](../general/computer.md).通常来说,把组件限制在本地网络是个好主意,如果被不怀好意的熊控制了你的机器人,那么你家就完蛋了. -可以用来避免[电脑](../general/computer.md) 链接到错误的 [屏幕](screen1.md) 或者避免组件崩溃 (可能崩掉电脑,并使之无法启动). +可避免电脑链接到错误的屏幕,或者避免组件崩溃(可能崩掉电脑,并使之无法启动). -中继器可以安装[无线网卡](../item/wlanCard.md) 来无线传递消息. 无线消息也可以被其他的中继器接受并转发, 或者是被有无线网卡的电脑收到 +中继器可以安装[无线网卡](../item/wlanCard.md),发送无线消息.其他的中继器可接受并转发,或者是被有无线网卡的电脑收到. -中继器也可以安装[连接卡](../item/linkedCard.md).此时他会将消息转发到链接卡的信道里面, 记得保持中继器能源 +中继器也可以安装[连接卡](../item/linkedCard.md).消息被转发到链接卡的信道里面, 记得保持中继器能源. -中继器不会记下包的路径, 因此请避免网络环路(现实中将触发广播风暴,全网瘫痪). 由于中继器资源不是无限的,过于频繁的发包将会导致丢包. +中继器不会记下包的路径,因此请避免网络环路(现实中将触发广播风暴,全网瘫痪).由于中继器资源不是无限的,过于频繁的发包将会导致丢包. 你也可以通过升级来加速转发速度. -包只会被转发有限次数(TTL),当TTL降为0时,包会被自动丢弃,缺省的TTL是5,每转发一次减去1 +包只会被转发有限次数(TTL),当TTL降为0时,包会被自动丢弃,缺省的TTL是5,每转发一次减去1. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md index 804662776..b21cf68f4 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/screen1.md @@ -2,9 +2,17 @@ ![See this?](oredict:oc:screen1) -显示屏需要和显卡一起使用, 使得电脑能够显示文本.不同型号的屏幕能够显示不同的东西, 比如不同的分辨率和色深. 从低分单色屏到高分256色屏幕,可用分辨率取决于最差的那个配件。 当使用T1显卡和T3屏幕时,仅T1的分辨率和色深可用,反之亦然。但是T3显卡的运行速度会快些 +显示屏需要和显卡一起使用, 使得电脑能够显示文本.不同型号的屏幕能够显示不同的东西, 比如不同的分辨率和色深. 从低分单色屏到高分256色屏幕,可用分辨率取决于最差的那个配件. -屏幕可以相邻放置组成多方块屏幕,需要朝向一样. 旋转的上下方向也要一直. 屏幕旋转方向可以通过拿在手上的屏幕里面的箭头确定.屏幕大小对分辨率无影响,屏幕也可以染色来控制哪两块屏幕可以连接,手持染料右键即可,染料不会消耗掉. 屏幕在敲下来以后仍然保持他的颜色. 不同色不会连一起,同色不同型也不会.T2和T3屏支持鼠标. 屏幕会响应点击事件(只会在有键盘的时候或者是按下蹲的时候打开),在屏幕没有键盘的时候,蹲下是唯一操作办法.注意在交互是是否打开屏幕是可以通过组件API控制的T3可以配置为接受更高的点击精度,这可以让人判定是点击上半个字符还是下半个,可以用来模拟更高分辨率的屏幕。 +当使用T1显卡和T3屏幕时,仅T1的分辨率和色深可用,反之亦然.但是T3显卡的运行速度会快些 + +屏幕可以相邻放置组成多方块屏幕,需要朝向一样. 旋转的上下方向也一致. 可以通过手上的确定屏幕旋转方向.屏幕大小对分辨率无影响. + +可以通过染色,控制哪两块屏幕可以连接,手持染料右键即可,染料不会消耗掉. 屏幕在敲下来以后仍然保持他的颜色. 不同色不会连一起,同色不同型也不会. + +T2和T3屏支持鼠标. 屏幕会响应点击事件(只会在有键盘的时候或者是按下蹲的时候打开),在屏幕没有键盘的时候,蹲下是唯一操作办法.注意是否打开屏幕是可以通过组件API控制的. + +T3可以配置为接受更高的点击精度,这可以让人判定是点击上半个字符还是下半个,可以用来模拟更高分辨率的屏幕. 分辨率如下: T1: 50x16, 单色. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md b/src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md index de7318228..05020db66 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/block/waypoint.md @@ -1,6 +1,6 @@ # Waypoint !["This way!" - "No, that way!"](oredict:oc:waypoint) -路径点重点不在本身,而是如何使用. 导航升级可以探测路径点, 因此安装了这种升级的设备就可以通过它导航. 这在对机器人和无人机写高度可重用的程序时很有用. -注意导航升级报告的路径点位置指的是路径点方块的正面相邻的方块(粒子效果指示). 因此你可以把他放在箱子的边上或者上方, 通过将路径点看作“箱子上方”,而不必在你的程序里面旋转路点坐标。 -一个路点有两个属性: 一个是收到的红石信号强度, 一个是可编辑的标签. 它是32长度字符串,并且可以在连接路点的设备上进行编辑,它告诉我们路点该如何使用 \ No newline at end of file +路径点重点不在本身,而是如何使用. 导航升级可以探测路径点, 因此安装了这种升级的设备就可以通过它导航. 这在对机器人和无人机写高度可重用的程序时很有用. +注意!导航升级报告的路径点位置,指的是路径点方块的正面,相邻的方块(粒子效果指示). 因此你可以把他放在箱子的边上或者上方, 通过将路径点看作“箱子上方”,而不必在你的程序里面旋转路点坐标。 +一个路点有两个属性:一个是收到的红石信号强度, 一个是可编辑的标签. 它是32长度字符串,可以在连接路点的设备上进行编辑,它告诉我们路点该如何使用 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md b/src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md index 54ac19b41..a76796d0d 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/general/quickstart.md @@ -8,52 +8,52 @@ ![A tier two computer case.](oredict:oc:case2) -比如你要挑一个适合你的 [显卡](../item/graphicsCard1.md)(GTX690,GTX1080,划掉), 还可能需要一个[网卡](../item/lanCard.md), 一块 [红石卡](../item/redstoneCard1.md) , 如果你是可以调创造的狗管理你还可以拿出 [调试卡](../item/debugCard.md). +比如你要挑一个适合你的 [显卡](../item/graphicsCard1.md)(GTX690,GTX1080,划掉), 还可能需要一个[网卡](../item/lanCard.md), 一块 [红石卡](../item/redstoneCard1.md) , 如果你是可以调创造的狗管理你还可以拿出 [调试卡](../item/debugCard.md). -打开[机箱](../block/case1.md)你会看到一系列的槽位. 上面写了槽位的数量,可以放什么样的配件进去,等 (槽位小字有写),这些数据取决于机箱档次. +打开[机箱](../block/case1.md)你会看到一系列的槽位. 上面写了槽位的数量,可以放什么样的配件进去,等 (槽位小字有写),这些数据取决于机箱档次. ![GUI of a tier two computer case.](opencomputers:doc/img/configuration_case1.png) 如果没放东西, [机箱](../block/case1.md)完全没用. 如果你试图按下 [电脑](computer.md)的开机键, 他只会立刻在你的聊天框输出一条错误, 用蜂鸣声提示你. 幸运的是他提醒了你要怎么去做: 电脑需要能源. 把你的电脑接发电机, 或者是接到[能量转换器](../block/powerConverter.md). -这次启动, 他会告诉你电脑需要 [CPU](../item/cpu1.md). CPU分不同级别,越高级的要越多的东西合成,执行速度也快。选择一款CPU,丢进你的[机箱](../block/case1.md). +这次启动, 他会告诉你电脑需要 [CPU](../item/cpu1.md). CPU分不同级别,越高级的要越多的东西合成,执行速度也快.选择一款CPU,丢进你的[机箱](../block/case1.md). -好的这次他要你放[内存](../item/ram1.md)了 . 注意警报变化了: 长-短. 越高级的 [内存](../item/ram1.md)容量越大,跑的程序越多. 运行 [OpenOS](openOS.md), 这篇教程的目标, 需要至少2条T1 [内存](../item/ram1.md). +好的这次他要你放[内存](../item/ram1.md)了 . 注意警报变化了: 长-短. 越高级的 [内存](../item/ram1.md)容量越大,跑的程序越多. 运行 [OpenOS](openOS.md), 这篇教程的目标, 需要至少2条T1 [内存](../item/ram1.md). -ok,做的很好,现在[机箱](../block/case1.md) 变成这样了: +ok,做的很好,现在[机箱](../block/case1.md) 变成这样了: ![Partially configured computer.](opencomputers:doc/img/configuration_case2.png) -别急, 现在虽然不会打印错误了, 但是他也什么都做不了. 至少他还会发出两声警报. 这意味着电脑进入执行状态,但是未能成功. In other words: it technically runs! This is where a very useful tool comes into play: the [analyzer](../item/analyzer.md). This tool allows inspecting many of OpenComputers' blocks, as well as some blocks from other mods. To use it on the [computer](computer.md), use the [analyzer](../item/analyzer.md) on the case while sneaking. +别急, 现在虽然不会打印错误了, 但是他也什么都做不了. 至少他还会发出两声警报. 这意味着电脑进入执行状态,但是未能成功. In other words: it technically runs! This is where a very useful tool comes into play: the [analyzer](../item/analyzer.md). This tool allows inspecting many of OpenComputers' blocks, as well as some blocks from other mods. To use it on the [computer](computer.md), use the [analyzer](../item/analyzer.md) on the case while sneaking. 你会在聊天框看到 [电脑](computer.md) 遇到的错误: `no bios found; install configured EEPROM` -这说明你需要一个刷写程序的E2PROM芯片装入机箱来指定电脑的任务 +这说明:你需要一个刷写过程序的E2PROM芯片,并装入机箱 -注意那个 configured,需要刷一个程序。合成E2PROM很简单,但是刷写程序需要电脑,是不是难了点,这里我们要直接合成一个预刷写LUA BIOS的E2PROM,使用E2PROM和你的手册合成,将这个ROM丢进机箱,开机! +注意那个 configured,需要刷一个程序.合成E2PROM很简单,但是刷写程序需要电脑,是不是难了点,这里我们要直接合成一个预刷写LUA BIOS的E2PROM,使用E2PROM和你的手册合成,将这个ROM丢进机箱,开机! -啊哈哈,还是啥都没有,但是我们看到了一条信息 +啊哈哈,还是啥都没有,但是我们看到了一条信息 `no bootable medium found; file not found` -说明Lua BIOS运行正常,它执行了对文件系统的搜索,如根目录含有init.lua的[软盘](../item/floppy.md)或者[硬盘](../item/hdd1.md),因此我们现在需要一张带有OpenOS安装的软盘(用空磁盘+手册合成) +说明Lua BIOS运行正常,它执行了对文件系统的搜索,如根目录含有init.lua的[软盘](../item/floppy.md)或者[硬盘](../item/hdd1.md),因此我们现在需要一张带有OpenOS安装的软盘(用空磁盘+手册合成) -嗯,如果你用了T2机箱,那么你还要做一个[软盘驱动器](../block/diskDrive.md)来读盘,如果是T3及以上那么直接放到机箱就行了,如果使用驱动器,那么将驱动器放在电脑边上,插入软盘,启动 +嗯,如果你用了T2机箱,那么你还要做一个[软盘驱动器](../block/diskDrive.md)来读盘,如果是T3及以上那么直接放到机箱就行了,如果使用驱动器,那么将驱动器放在电脑边上,插入软盘,启动 -好的,他启动了。如果有什么问题的话,可以使用[分析仪](../item/analyzer.md)排查。不过我们的电脑应该跑起来了。 +好的,他启动了.如果有什么问题的话,可以使用[分析仪](../item/analyzer.md)排查.不过我们的电脑应该跑起来了. -最难的部分已经过去了,剩下就是如何让电脑输出信息,并且让电脑接受输入 +最难的部分已经过去了,剩下就是如何让电脑输出信息,并且让电脑接受输入 -你需要将一个[屏幕](../block/screen1.md)安放在电脑上 ,并在机箱安装[显卡](../item/graphicsCard1.md) +你需要将一个[屏幕](../block/screen1.md)安放在电脑上 ,并在机箱安装[显卡](../item/graphicsCard1.md) ![No, it's not a flatscreen.](oredict:oc:screen2) -之后你就可以看到电脑的输出,然后电脑就会等待你的操作了,尝试一下吧!敲入 'lua' 并按下回车,你将会得到lua交互解释器的帮助(英文),你可以测试基本lua命令,更多信息见[the Lua page](lua.md) +之后你就可以看到电脑的输出,然后电脑就会等待你的操作了,尝试一下吧!敲入 'lua' 并按下回车,你将会得到lua交互解释器的帮助(英文),你可以测试基本lua命令,更多信息见[the Lua page](lua.md) ![It lives!](opencomputers:doc/img/configuration_done.png) -之后就可以建造更复杂的 [电脑](computer.md), [服务器](../item/server1.md) ,用 [组装机](../block/assembler.md) 组装[机器人](../block/robot.md), [无人机](../item/drone.md), [单片机](../block/microcontroller.md) 和 [平板](../item/tablet.md). +之后就可以建造更复杂的 [电脑](computer.md), [服务器](../item/server1.md) ,用 [组装机](../block/assembler.md) 组装[机器人](../block/robot.md), [无人机](../item/drone.md), [单片机](../block/microcontroller.md) 和 [平板](../item/tablet.md). Happy coding! \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/index.md b/src/main/resources/assets/opencomputers/doc/zh_CN/index.md index 0036a4296..637c571de 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/index.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/index.md @@ -2,6 +2,8 @@ OpenComputers 是一个持久化,模块化,高度可定制化的mod,在游戏中提供了 [电脑](general/computer.md), [服务器](item/server1.md), [机器人](block/robot.md), 和 [无人机](item/drone.md) .所有设备均可通过LUA5.2编写程序, 实现各种复杂的系统. +可能有的地方会因为省略的原因,说话有一点歧义,因为这个mod显示手册的时候,埋藏了操蛋的bug,英文状态下没问题,中文句子一长,这货就卡死了,还是经过几个小时的debug才发现的! + 通过 [关于手册](item/manual.md)学习mod (绿字是链接,可点击). ## 内容 @@ -21,10 +23,10 @@ OpenComputers 是一个持久化,模块化,高度可定制化的mod,在游 - [物品](item/index.md) - [方块](block/index.md) -### Guides -- [Getting Started](general/quickstart.md) +### 指导 +- [快速上手](general/quickstart.md) -## Overview +## 概要 如上文所说, 电脑可以持久化的存储自己的状态, 意味着运行的 [电脑](general/computer.md) 即使在所属区块被卸载时也能保持住自己的状态. 也就是说当玩家离开 [电脑](general/computer.md)所在的区块, 或者退出后, [电脑](general/computer.md) 将会记住离开前最后一刻的状态, 并在区块被加载后重新从断电恢复运转[电脑](general/computer.md). 特性 不包括[平板](item/tablet.md). @@ -35,13 +37,3 @@ OpenComputers 与多个mod兼容,不论是方块还是实体。(通过 [适配 虽说有些限制,OC mod依然提供了大量的可能性. [电脑](general/computer.md) 是基础, 能够做到大多数事情, CPU是核心. [电脑](general/computer.md) 可以访问周围6个面的组件. [服务器](item/server1.md) 可以通过 [总线](item/componentBus1.md)链接更多设备 (内部或外部互联), ; 但是服务器只能被安装在[机架](block/rack.md), 他只能被从[机架](block/rack.md)的一侧被访问到, 访问的侧可以被从 [机架](block/rack.md) GUI设定. [单片机](block/microcontroller.md) 功能十分受限 (比起普通的[电脑](general/computer.md)), 因为他们只有可怜的存储[硬盘](item/hdd1.md) 和外置存储 [软盘驱动器](block/diskDrive.md) , 意味着通常的 [OpenOS](general/openOS.md) 无法被安装到 [单片机](block/microcontroller.md). [单片机](block/microcontroller.md)只有一个 [E2PROM](item/eeprom.md)槽, 只能被编程为执行有限的简单任务. [机器人](block/robot.md) 是移动的 [电脑](general/computer.md), 可以与世界交互 (但无法和外部电脑方块交互).不像 [电脑](general/computer.md), [机器人](block/robot.md) 一经建造,内部的部件就不能再被改变或者去除. 为了解决这个问题, [机器人](block/robot.md) 可以被 [升级](item/upgradeContainer1.md) 或者 [卡片](item/cardContainer1.md) 插入, 允许热升级或者插拔卡片. [OpenOS](general/openOS.md) 可以在 [机器人](block/robot.md) 上面通过放一个[硬盘](block/diskDrive.md) 安装, 也允许插入 [软盘](item/floppy.md) disks, 或者插入预装了OpenOS的硬盘. 重设机器人需要将机器人[拆解](block/disassembler.md) . [无人机](item/drone.md)是阉割版机器人 [robots](block/robot.md). 他们只有少量物品栏,移动方式也和机器人不同, 像[单片机](block/microcontroller.md)一样安不上操作系统, [无人机](item/drone.md) 可以被插入预编程的 [E2PROM](item/eeprom.md)). 大部分情况下, [机器人](block/robot.md) 和 [无人机](item/drone.md) 使用相同的配件和更新; 然而, 这些东西在无人机和机器人的表现不统一, [物品栏升级](item/inventoryUpgrade.md) 每次只提供四个物品栏, 最多8个, [机器人](block/robot.md) 可以携带最多四个,每个提供16个物品的 [物品栏升级](item/inventoryUpgrade.md) - -##机器人 - -制作机器人请将机箱放到组装器里面,这样就可以做机器人了 - -可以装入各种升级和卡片,配备软驱的机器人还可以安装OS - -机器人的汉化卡死,所以就简单的说下好了 - -E文好的可以去看E文手册 diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md index 2878b549f..43c943288 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/cardContainer1.md @@ -2,4 +2,4 @@ ![Can haz cards!](oredict:oc:cardContainer1) -[机器人](../block/robot.md) 的物品栏升级之一,允许热插拔卡。单个槽最大卡数等于这个升级的等级. 这个容器的复杂度是一般的两倍. 参见 [here](../block/robot.md) 机器人复杂度 +[机器人](../block/robot.md) 的物品栏升级之一,允许热插拔卡.单个槽最大卡数等于这个升级的等级.这个容器的复杂度是一般的两倍.参见[机器人复杂度](../block/robot.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md index 291049ed2..775aa6ea7 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hdd1.md @@ -2,4 +2,4 @@ ![Spaaaace.](oredict:oc:hdd1) -熟悉的存储器,存储速度一样,档次决定空间大小,有的机器只能用硬盘. \ No newline at end of file +熟悉的存储器,存储速度一样,档次决定空间大小,有的机器只能用硬盘. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md index 26a5b6885..e89ff43ad 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverBoots.md @@ -2,8 +2,8 @@ ![Step on it.](oredict:oc:hoverBoots) -如果不想去编程 [无人机](drone.md), 有个变通的办法: 踏脚石! +如果不想去编程[无人机](drone.md),有个变通的办法:悬浮鞋! -鞋子有个特点: 只要有能量你就能跳得更高, 然后吸收落地的冲击力. 意思是你可以跳上4格子高然后将落地的冲击降到30%,也就是说你可以在4格子高跳下而不掉血. +鞋子有个特点:只要有能量你就能跳得更高, 然后吸收落地的冲击力.意思是你可以跳上4格子高,然后将落地的冲击降到30%,也就是说你可以在4格子高跳下而不掉血. -可以通过[充电机](../block/charger.md) ,AE2 充电器,工业充电盒子,或者是TE的充电器来充能, 靴子可以任意用染料染色 \ No newline at end of file +可以通过[充电机](../block/charger.md) ,AE2 充电器,工业充电盒子,或者是TE的充电器来充能, 靴子可以任意用染料染色 \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md index 406ae4332..3dfbb64ff 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/hoverUpgrade1.md @@ -2,12 +2,12 @@ ![Float like a feather.](oredict:oc:hoverUpgrade1) -允许 [机器人](../block/robot.md) 飞得更高. 缺省状态下机器人只能往上走8格子. 平常因为这足够爬墙所以这足够了. +允许 [机器人](../block/robot.md)飞得更高.缺省状态下机器人只能往上走8格子.平常因为这足够爬墙所以这足够了. 规律是这样的: -- 机器人只会在起点和终点都有效的情况下才会动 (e.g.允许搭桥). -- 机器人下方的位置永远有效(也就是说任何时候都可以往下走). -- 一个固体方块上方的飞行上限内的格子都是有效的 -- 拥有正对当前位置相邻的表面的点是有效的 (允许爬墙). +- 机器人只会在起点,终点都有效的情况下才会动(e.g.允许搭桥). +- 机器人下方的位置,永远有效(也就是说:任何时候都可以往下走). +- 一个固体方块上方的飞行上限内的格子,都是有效的 +- 拥有正对当前位置,相邻的表面的点是有效的(允许爬墙). 这几个规则演示一下就是这样: diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md index 446690ba3..922616ed3 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/index.md @@ -1,24 +1,24 @@ -# Items +# 物品 -This index lists all of the documented items in OpenComputers. If you're looking for a block, check out the [block index](../block/index.md) instead. +本索引列举了OC所有物品. 如果你要找方块点[这里](../block/index.md). -Keep in mind that some of these may not be available, depending on the recipe set used. +注意有的物品会由于合成表的原因不可用 -## Tools +## 工具 * [分析仪](analyzer.md) * [手册](manual.md) * [远控终端](terminal.md) * [纹理拾取器](texturePicker.md) * [扳手](wrench.md) -## Devices +## 设备 * [无人机](drone.md) * [服务器](server1.md) * [平板](tablet.md) -## Components +## 组件 -### Cards +### 卡片 * [抽象总线卡](abstractBusCard.md) * [数据卡](dataCard1.md) * [调试卡(创造)](debugCard.md) (aka AMI) @@ -30,7 +30,7 @@ Keep in mind that some of these may not be available, depending on the recipe se * [无线网卡](wlanCard.md) * [世界传感器卡](worldSensorCard.md) -### Upgrades +### 升级 * [天使升级](angelUpgrade.md) * [电池升级](batteryUpgrade1.md) * [卡槽升级](cardContainer1.md) @@ -54,12 +54,12 @@ Keep in mind that some of these may not be available, depending on the recipe se * [交易升级](tradingUpgrade.md) * [升级箱](upgradeContainer1.md) -### Rack Mountables +### 机架组件 * [软驱](diskDriveMountable.md) * [服务器](server1.md) * [终端服务器](terminalServer.md) -### Other +### 杂项 * [APU](apu1.md) * [组件总线](componentBus1.md) * [CPU](cpu1.md) @@ -68,7 +68,7 @@ Keep in mind that some of these may not be available, depending on the recipe se * [硬盘驱动器](hdd1.md) * [内存](ram1.md) -## Crafting +## 合成 * [酸液](acid.md) * [逻辑运算单元](alu.md) * [方向键](arrowKeys.md) @@ -85,13 +85,13 @@ Keep in mind that some of these may not be available, depending on the recipe se * [粗电路板](rawCircuitBoard.md) * [晶闸管](transistor.md) -## Assembling / Printing +## 组装 / 打印 * [油墨](chamelium.md) * [墨盒](inkCartridge.md) * [无人机箱](droneCase1.md) * [微控制器箱](microcontrollerCase1.md) * [平板壳子](tabletCase1.md) -## Other +## 其他 * [悬浮鞋](hoverBoots.md) * [纳米机械](nanomachines.md) diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md index 65571a407..95625046f 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/mfu.md @@ -2,6 +2,6 @@ ![You will never know the true meaning of this acronym.](oredict:oc:mfu) -此升级提供了一个远程的 [适配器](../block/adapter.md). 在任意方块边上蹲下并右键都会把它绑定到特定位置. 然后放到附近的适配器里面 (这个附近很有限) 然后适配器就会像刚好在你绑定的那个边上放着那样工作(一般的适配器要挨着,这里隔了一点距离)! - +此升级提供了一个远程的[适配器](../block/adapter.md).在任意方块边上蹲下,并右键,都会把它绑定到特定位置.然后放到附近的适配器里面(这个附近很有限).适配器就会像刚好在 +你绑定的那个方块边上放着那样工作(一般的适配器要挨着,这里隔了一点距离)! 记住,保持远程适配器链接需要能量. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md index ce86619f6..ec251d14e 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/tablet.md @@ -2,12 +2,12 @@ ![Touch me if you can.](item:OpenComputers:item@68) -通过将[平板外壳](tabletCase1.md)放到[组装机](../block/assembler.md), 来配置并组装平板. 平板是一种小巧的,无法直接交互世界的电脑,比如[基础红石卡](redstoneCard1.md)就没法用. 不过另一批就可以,比如 [告示牌升级](signUpgrade.md),[活塞升级](pistonUpgrade.md). +通过将[平板外壳](tabletCase1.md)放到[组装机](../block/assembler.md),来配置并组装平板.平板是一种小巧的,无法直接交互世界的电脑,比如[基础红石卡](redstoneCard1.md)就没法用. 不过另一批就可以,比如 [告示牌升级](signUpgrade.md),[活塞升级](pistonUpgrade.md). T2平板允许安装一个物品栏升级. 可以通过蹲下+右键打开平板UI访问, 此时平板将强制关机. -不像电脑,平板不能保持状态,比如玩家拿着平板,退出,重进,平板退出前的状态是不会保留的,必须关闭平板. 跨维度也不可以,比如去地狱再会来,运行状态会丢失. +不像电脑,平板不能保持状态,比如玩家拿着平板,退出,重进,平板退出前的状态是不会保留的,必须关闭平板. 跨维度也不可以,比如去地狱再会来,运行状态会丢失. -可以放在 [充电机](../block/charger.md) 补充能量, 电脑可以通过连接的充电机访问平板的第一硬盘,此时充电机就像软驱,平板起了软盘的作用. 当你不小心搞坏了平板的系统的时候这很有用。 +可以放在 [充电机](../block/charger.md) 补充能量, 电脑可以通过连接的充电机访问平板的第一硬盘,此时充电机就像软驱,平板起了软盘的作用. 当你不小心搞坏了平板的系统的时候这很有用. -另一个高级用法是通过在一个方块上使用约一秒(长按右键)发射特定方块相关的信号,会有一声蜂鸣通知你信号被发射,仅在安装了信号发射相关升级时可用。 比如[地形分析器](../block/geolyzer.md) 会添加方块信息,如硬度, [导航升级](navigationUpgrade.md) 会添加方块相对于拿着平板的玩家的坐标信息. 拿着平板的时候,这样的方块会被高亮标记。 +另一个高级用法:通过在一个方块上长按右键约一秒,发射特定方块相关的信号,会有一声蜂鸣通知你信号被发射,仅在安装了信号发射相关升级时可用. 比如[地形分析器](../block/geolyzer.md) 会添加方块信息,如硬度, [导航升级](navigationUpgrade.md),会添加方块相对于拿着平板的玩家的坐标信息. 拿着平板的时候,这样的方块会被高亮标记. diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md index 430e1eab5..2cca22766 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/terminal.md @@ -2,8 +2,9 @@ ![Remote access.](oredict:oc:terminal) -终端提供了对 [终端服务器](terminalServer.md)的远程访问. 激活一台在机架安装的[终端服务器](terminalServer.md), 选择要绑定到终端的服务器即可. +终端提供了对[终端服务器](terminalServer.md)的远程访问. 激活一台在机架安装的[终端服务器](terminalServer.md), 选择要绑定到终端的服务器即可. -[终端服务器](terminalServer.md) 提供了[虚拟屏幕](../block/screen1.md) 和[虚拟键盘](../block/keyboard.md)(类似于openssh server),可以通过终端访问. 注意不要将实体键盘和屏幕连接到终端服务器所在的子网,否则发生的事情是未定义行为. 使用绑定了的终端后,一个和电脑连接屏幕和键盘一样的界面会打开,你在这个GUI做的事情将会被反馈到远程的机器 +[终端服务器](terminalServer.md)提供了[虚拟屏幕](../block/screen1.md),[虚拟键盘](../block/keyboard.md)(类似于openssh server),可以通过终端访问.注意:切勿将实体键盘和屏幕连到终端服务器所在的子网,否则发生的事情是未定义行为. 使用绑定了的终端后,一个和电脑连接屏幕和键盘一样的界面会打开,你在这个GUI做的事情将会被反馈到远程的机器 多个终端可以被绑定到同一个[终端服务器](terminalServer.md), 但是他们共享显示和输入,这是和sshd不同的地方. [终端服务器](terminalServer.md) 只能绑定有限数量的终端. 达到上限后,继续绑定会踢出最先绑定的终端. + \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md index 3a52941e8..f32b26a08 100644 --- a/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md +++ b/src/main/resources/assets/opencomputers/doc/zh_CN/item/wlanCard.md @@ -2,6 +2,6 @@ ![May cause cancer. May not.](oredict:oc:wlanCard) -无线网卡是 [网卡](lanCard.md) 的升级, 添加了收发无线信号的能力。无线信号发射强度决定了信息可以传多远, 信号强度等于方块距离. +无线网卡是 [网卡](lanCard.md) 的升级, 添加了收发无线信号的能力.无线信号发射强度决定了信息可以传多远, 信号强度等于方块距离. -强度越高发射所需能量越大. 地形也会干扰到发送过程. 信号强度 - 方块硬度 > 0 时,信号可以穿透方块,并且强度将衰减到 信号强度 - 方块硬度,空气硬度是1,当强度下降到0时,目标将不会收到信号. 通常你需要保证发送和接受之间的连线是净空的. \ No newline at end of file +强度越高发射所需能量越大.地形也会干扰到发送过程.信号强度 - 方块硬度 > 0 时,信号可以穿透方块,并且强度将衰减到信号强度 - 方块硬度,空气硬度是1,当强度下降到0时,目标将不会收到信号.通常你需要保证发送和接受之间的连线是净空的. \ No newline at end of file From 8066412830c5b7aeeb3bd46673ca37f2945e0d7b Mon Sep 17 00:00:00 2001 From: Vexatos Date: Mon, 12 Jun 2017 23:39:55 +0200 Subject: [PATCH 08/37] Fixed Agents not being able to place blocks. --- src/main/scala/li/cil/oc/server/agent/Player.scala | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/main/scala/li/cil/oc/server/agent/Player.scala b/src/main/scala/li/cil/oc/server/agent/Player.scala index eaeeadce2..cc8753df0 100644 --- a/src/main/scala/li/cil/oc/server/agent/Player.scala +++ b/src/main/scala/li/cil/oc/server/agent/Player.scala @@ -23,6 +23,7 @@ import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer.SleepResult import net.minecraft.init.Blocks import net.minecraft.init.Items +import net.minecraft.inventory.EntityEquipmentSlot import net.minecraft.inventory.IInventory import net.minecraft.item.ItemBlock import net.minecraft.item.ItemStack @@ -209,6 +210,19 @@ class Player(val agent: internal.Agent) extends FakePlayer(agent.world.asInstanc }) } + override def setItemStackToSlot(slotIn: EntityEquipmentSlot, stack: ItemStack): Unit = { + if (slotIn == EntityEquipmentSlot.MAINHAND) { + agent.mainInventory.setInventorySlotContents(agent.selectedSlot, stack) + } + super.setItemStackToSlot(slotIn, stack) + } + + override def getItemStackFromSlot(slotIn: EntityEquipmentSlot): ItemStack = { + if (slotIn == EntityEquipmentSlot.MAINHAND) + agent.mainInventory.getStackInSlot(agent.selectedSlot) + else super.getItemStackFromSlot(slotIn) + } + def fireRightClickBlock(pos: BlockPos, side: EnumFacing): PlayerInteractEvent.RightClickBlock = { val hitVec = new Vec3d(0.5 + side.getDirectionVec.getX * 0.5, 0.5 + side.getDirectionVec.getY * 0.5, 0.5 + side.getDirectionVec.getZ * 0.5) val event = new PlayerInteractEvent.RightClickBlock(this, EnumHand.MAIN_HAND, pos, side, hitVec) From b82f40a5bdc86e076b053848ca47e42ddbb5155f Mon Sep 17 00:00:00 2001 From: Love_Sara_Lee Date: Thu, 15 Jun 2017 14:26:12 +0800 Subject: [PATCH 09/37] remove accidental indent change --- src/main/scala/li/cil/oc/client/gui/Manual.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/client/gui/Manual.scala b/src/main/scala/li/cil/oc/client/gui/Manual.scala index b1bb780da..02a3cc9eb 100644 --- a/src/main/scala/li/cil/oc/client/gui/Manual.scala +++ b/src/main/scala/li/cil/oc/client/gui/Manual.scala @@ -57,7 +57,7 @@ class Manual extends GuiScreen with traits.Window { } def refreshPage(): Unit = { - val content = Option(api.Manual.contentFor(ManualAPI.history.top.path)). + val content = Option(api.Manual.contentFor(ManualAPI.history.top.path)). getOrElse(asJavaIterable(Iterable("Document not found: " + ManualAPI.history.top.path))) document = Document.parse(content) documentHeight = Document.height(document, documentMaxWidth, fontRendererObj) From 829a62a9919b6a2441342abdeb6e1da9bbf929aa Mon Sep 17 00:00:00 2001 From: SDPhantom Date: Thu, 22 Jun 2017 18:50:09 -0700 Subject: [PATCH 10/37] Optimized filesystem.name() / Fix filesystem.copy() (#2432) * Fixed possible error reporting bug in filesystem.copy() Made local data initialize to false. Previously was nil and if the function was unable to open either file, this would cause the function to return true as its first value. data becomes nil when copying is finished, so this sorts itself out. Added arg checking to filesystem.name --- .../assets/opencomputers/loot/openos/lib/filesystem.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua index 8f7c553d0..2e4ab54a0 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua @@ -282,6 +282,7 @@ function filesystem.path(path) end function filesystem.name(path) + checkArg(1, path, "string") local parts = segments(path) return parts[#parts] end @@ -436,7 +437,7 @@ function filesystem.rename(oldPath, newPath) end function filesystem.copy(fromPath, toPath) - local data + local data = false local input, reason = filesystem.open(fromPath, "rb") if input then local output, reason = filesystem.open(toPath, "wb") From da059756b9bbb210351420c79ebb72fda666a6a7 Mon Sep 17 00:00:00 2001 From: SDPhantom Date: Thu, 22 Jun 2017 18:50:09 -0700 Subject: [PATCH 11/37] Optimized filesystem.name() / Fix filesystem.copy() (#2432) * Fixed possible error reporting bug in filesystem.copy() Made local data initialize to false. Previously was nil and if the function was unable to open either file, this would cause the function to return true as its first value. data becomes nil when copying is finished, so this sorts itself out. Added arg checking to filesystem.name --- .../assets/opencomputers/loot/openos/lib/filesystem.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua index 8f7c553d0..2e4ab54a0 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua @@ -282,6 +282,7 @@ function filesystem.path(path) end function filesystem.name(path) + checkArg(1, path, "string") local parts = segments(path) return parts[#parts] end @@ -436,7 +437,7 @@ function filesystem.rename(oldPath, newPath) end function filesystem.copy(fromPath, toPath) - local data + local data = false local input, reason = filesystem.open(fromPath, "rb") if input then local output, reason = filesystem.open(toPath, "wb") From cdfdb277f69d2543f10fc929d8beaf2fc0b91a91 Mon Sep 17 00:00:00 2001 From: payonel Date: Thu, 22 Jun 2017 16:46:52 -0700 Subject: [PATCH 12/37] replacing yield_all with yield_past to control stack yielding This change should allow popen, pipes, and threads to specify with exactness how many coroutines back they want to yield. This makes popen and threads immune to internal coroutine scenarios Also using a code cleanup provided by @SDPhantom --- .../loot/openos/boot/01_process.lua | 11 ++-- .../opencomputers/loot/openos/lib/pipe.lua | 53 ++++++++++++------- .../opencomputers/loot/openos/lib/thread.lua | 4 +- 3 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua index 9bab80513..8d1929bbc 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua @@ -6,7 +6,11 @@ local _coroutine = coroutine -- real coroutine backend _G.coroutine = setmetatable( { resume = function(co, ...) - return assert(process.info(co), "thread has no proc").data.coroutine_handler.resume(co, ...) + local proc = process.info(co) + -- proc is nil if the process closed, natural resume will likely complain the coroutine is dead + -- but if proc is dead and an aborted coroutine is alive, it doesn't have any proc data like stack info + -- if the user really wants to resume it, let them + return (proc and proc.data.coroutine_handler.resume or _coroutine.resume)(co, ...) end }, { @@ -51,10 +55,7 @@ end _coroutine.wrap = function(f) local thread = coroutine.create(f) return function(...) - local result_pack = table.pack(coroutine.resume(thread, ...)) - local result, reason = result_pack[1], result_pack[2] - assert(result, reason) - return select(2, table.unpack(result_pack)) + return select(2, coroutine.resume(thread, ...)) end end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/pipe.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/pipe.lua index 4f16688cd..80904f055 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/pipe.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/pipe.lua @@ -22,17 +22,18 @@ function pipe.createCoroutineStack(root, env, name) function pco.yield(...) return _root_co.yield(nil, ...) end - function pco.yield_all(...) - return _root_co.yield(true, ...) + function pco.yield_past(co, ...) + return _root_co.yield(co, ...) end function pco.resume(co, ...) checkArg(1, co, "thread") local args = table.pack(...) while true do -- for consecutive sysyields local result = table.pack(_root_co.resume(co, table.unpack(args, 1, args.n))) + local target = result[2] == true and pco.root or result[2] if not result[1] or _root_co.status(co) == "dead" then return table.unpack(result, 1, result.n) - elseif result[2] and pco.root ~= co then + elseif target and target ~= co then args = table.pack(_root_co.yield(table.unpack(result, 2, result.n))) else return true, table.unpack(result, 3, result.n) @@ -70,7 +71,8 @@ local pipe_stream = return self end -- not reading, it is requesting a yield - result = table.pack(coroutine.yield_all(table.unpack(result, 2, result.n))) + -- yield_past(true) will exit this coroutine stack + result = table.pack(coroutine.yield_past(true, table.unpack(result, 2, result.n))) result = table.pack(coroutine.resume(self.next, table.unpack(result, 1, result.n))) -- the request was for an event end end, @@ -113,7 +115,7 @@ local pipe_stream = -- natural yield (i.e. for events). To differentiate this yield from natural -- yields we set read_mode here, which the pipe_stream write detects self.read_mode = true - coroutine.yield_all() + coroutine.yield_past(self.next) -- next is the first croutine in this stack self.read_mode = false end local result = string.sub(self.buffer, 1, n) @@ -158,16 +160,24 @@ end local chain_stream = { - read = function(self, value) + read = function(self, value, ...) if self.io_stream.closed then return nil end - -- handler is currently on yield all [else we wouldn't have control here] - local read_ok, ret = self.pco.resume(self.pco.root, value) - -- ret can be non string when a process ends - ret = type(ret) == "string" and ret or nil - return select(read_ok and 2 or 1, nil, ret) + -- wake up prog + self.ready = false -- the pipe proc sets this true when ios completes + local ret = table.pack(coroutine.resume(self.pco.root, value, ...)) + if coroutine.status(self.pco.root) == "dead" then + return nil + elseif not ret[1] then + return table.unpack(ret, 1, ret.n) + end + if not self.ready then + -- prog yielded back without writing/reading + return self:read(coroutine.yield()) + end + return ret[2] end, write = function(self, ...) - return self:read(table.concat({...})) + return self:read(...) end, close = function(self) self.io_stream:close() @@ -181,8 +191,8 @@ function pipe.popen(prog, mode, env) end local r = mode == "r" - local key = r and "read" or "write" + local chain = {} -- to simplify the code - shell.execute is run within a function to pass (prog, env) -- if cmd_proc where to come second (mode=="w") then the pipe_proc would have to pass -- the starting args. which is possible, just more complicated @@ -194,22 +204,27 @@ function pipe.popen(prog, mode, env) -- the stream needs its own process for io local pipe_proc = process.load(function() local n = r and 0 or "" + local key = r and "read" or "write" local ios = stream.io_stream while not ios.closed do - n = coroutine.yield_all(ios[key](ios, n)) + -- read from pipe + local ret = table.pack(ios[key](ios, n)) + stream.ready = true + -- yield outside the chain now + n = coroutine.yield_past(chain[1], table.unpack(ret, 1, ret.n)) end end, nil, nil, "pipe_handler") - local pipe_index = r and 2 or 1 - local cmd_index = r and 1 or 2 - local chain = {[cmd_index]=cmd_proc, [pipe_index]=pipe_proc} + chain[r and 1 or 2] = cmd_proc + chain[r and 2 or 1] = pipe_proc -- link the cmd and pipe proc io pipe.buildPipeChain(chain) - local cmd_stack = process.info(chain[1]).data.coroutine_handler + local cmd_data = process.info(chain[1]).data + local cmd_stack = cmd_data.coroutine_handler -- store handle to io_stream from easy access later - stream.io_stream = process.info(chain[1]).data.io[1].stream + stream.io_stream = cmd_data.io[1].stream stream.pco = cmd_stack -- popen commands start out running, like threads diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/thread.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/thread.lua index f602e7b77..317b28a7e 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/thread.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/thread.lua @@ -213,11 +213,11 @@ function thread.create(fp, ...) function mt.process.data.pull(_, timeout) mt.register(timeout) - -- yield_all will yield this pco stack + -- yield_past(root) will yield until out of this thread -- the callback will resume this stack local event_data repeat - event_data = table.pack(t.pco.yield_all(timeout)) + event_data = table.pack(t.pco.yield_past(t.pco.root, timeout)) -- during sleep, we may have been suspended until t:status() ~= "suspended" return table.unpack(event_data, 1, event_data.n) From f9f37897296ec5699718f9d723832ef63774e46f Mon Sep 17 00:00:00 2001 From: SDPhantom Date: Fri, 23 Jun 2017 15:52:47 -0700 Subject: [PATCH 13/37] Optimized sleep.lua interval parsing (#2436) * Optimized sleep.lua interval parsing Modified regex to use captures, consolidated invalid interval checks. Note: tonumber(nil) safely returns nil * Update sleep.lua Updated pattern matching --- .../assets/opencomputers/loot/openos/bin/sleep.lua | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/sleep.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/sleep.lua index 95701a159..43e2d5222 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/sleep.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/sleep.lua @@ -39,23 +39,15 @@ end local total_time = 0 for _,v in ipairs(args) do - local interval = v:match('^%d+%.?%d*[smhd]?$') - if not interval then - help(v) - return 1 - end - - local time_type = interval:match('[smhd]') or '' - interval = interval:sub(1, -#time_type-1) + local interval, time_type = v:match('^([%d%.]+)([smhd]?)$') interval = tonumber(interval) - if interval < 0 then + if not interval or interval < 0 then help(v) return 1 end - interval = time_type_multiplier(time_type) * interval - total_time = total_time + interval + total_time = total_time + time_type_multiplier(time_type) * interval end os.sleep(total_time) From 90fdcc19c541b5bfed2a4e3b1c93cb5172828051 Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 24 Jun 2017 09:04:11 -0700 Subject: [PATCH 14/37] keep env clean with intercepted loads also remove unused vars and some light code clean up moving some methods out of tty into delay loaded space for memory fix print from overwriting vbuf settings on stdout fix regression for expanding ${VAR} closes #2434 --- .../opencomputers/loot/openos/bin/rc.lua | 13 ++--- .../loot/openos/boot/00_base.lua | 3 +- .../loot/openos/boot/01_process.lua | 26 +++++----- .../loot/openos/lib/filesystem.lua | 8 +-- .../opencomputers/loot/openos/lib/sh.lua | 2 +- .../opencomputers/loot/openos/lib/text.lua | 4 +- .../opencomputers/loot/openos/lib/tty.lua | 49 ++----------------- .../loot/openos/opt/core/full_tty.lua | 41 +++++++++++++++- .../opencomputers/loot/openos/usr/man/sh | 7 ++- 9 files changed, 76 insertions(+), 77 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/rc.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/rc.lua index 488553626..ebb35364f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/rc.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/rc.lua @@ -1,6 +1,5 @@ local rc = require("rc") local fs = require("filesystem") -local shell = require("shell") local function loadConfig() local env = {} @@ -117,9 +116,7 @@ local function allRunCommand(cmd, ...) return results end -local args = table.pack(...) - -if #args == 0 then +if select("#", ...) == 0 then local results,reason = allRunCommand("start") if not results then local msg = "rc failed to start:"..tostring(reason) @@ -127,16 +124,16 @@ if #args == 0 then require("event").onError(msg) return end - for name, result in pairs(results) do + for _, result in pairs(results) do local ok, reason = table.unpack(result) if not ok then - io.stderr:write(reason .. "\n") + io.stderr:write(reason, "\n") end end else - local result, reason = runCommand(table.unpack(args)) + local result, reason = runCommand(...) if not result then - io.stderr:write(reason .. "\n") + io.stderr:write(reason, "\n") return 1 end end diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua index 50fe336b7..76c4c04ae 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua @@ -32,6 +32,7 @@ end function print(...) local args = table.pack(...) local stdout = io.stdout + local old_mode, old_size = stdout:setvbuf() stdout:setvbuf("line") local pre = "" for i = 1, args.n do @@ -39,6 +40,6 @@ function print(...) pre = "\t" end stdout:write("\n") - stdout:setvbuf("no") + stdout:setvbuf(old_mode, old_size) stdout:flush() end diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua index 8d1929bbc..9ae2e27be 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua @@ -26,18 +26,22 @@ local kernel_load = _G.load local intercept_load intercept_load = function(source, label, mode, env) if env then - local loader = setmetatable( - { - env = env, - load = intercept_load, - }, - {__call = function(tbl, _source, _label, _mode, _env) - return tbl.load(_source, _label, _mode, _env or tbl.env) - end}) - if env.load and (type(env.load) ~= "table" or env.load.load ~= intercept_load) then - loader.load = env.load + local prev_load = env.load or intercept_load + local env_mt = getmetatable(env) or {} + local env_mt_index = env_mt.__index + env_mt.__index = function(tbl, key) + if key == "load" then + return function(_source, _label, _mode, _env) + return prev_load(_source, _label, _mode, _env or env) + end + elseif type(env_mt_index) == "table" then + return env_mt_index[key] + elseif env_mt_index then + return env_mt_index(tbl, key) + end + return nil end - env.load = loader + setmetatable(env, env_mt) end return kernel_load(source, label, mode, env or process.info().env) end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua index 2e4ab54a0..2346e7ae7 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua @@ -136,7 +136,7 @@ function filesystem.concat(...) end function filesystem.get(path) - local node, rest = findNode(path) + local node = findNode(path) if node.fs then local proxy = node.fs path = "" @@ -155,7 +155,7 @@ end function filesystem.realPath(path) checkArg(1, path, "string") - local node, rest, vnode, vrest = findNode(path, false, true) + local node, rest = findNode(path, false, true) if not node then return nil, rest end local parts = {rest or nil} repeat @@ -199,7 +199,7 @@ function filesystem.link(target, linkpath) return nil, "not a directory" end - local node, rest, vnode, vrest = findNode(linkpath_real, true) + local _, _, vnode, _ = findNode(linkpath_real, true) vnode.links[filesystem.name(linkpath)] = target return true end @@ -235,7 +235,7 @@ function filesystem.mount(fs, path) if fstab[real] then return nil, "another filesystem is already mounted here" end - for path,node in pairs(fstab) do + for _,node in pairs(fstab) do if node.fs.address == fs.address then fsnode = node break diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua index 7ff6e33d4..a17cf0ddd 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua @@ -133,7 +133,7 @@ function sh.expand(value) end) :gsub("%${(.*)}", function(key) if sh.internal.isIdentifier(key) then - return sh.internal.expandKey(key) + return os.getenv(key) or '' end io.stderr:write("${" .. key .. "}: bad substitution\n") os.exit(1) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua index 1a0d8fd0e..764ba408f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua @@ -42,10 +42,10 @@ function text.wrap(value, width, maxWidth) end function text.wrappedLines(value, width, maxWidth) - local line, nl + local line return function() if value then - line, value, nl = text.wrap(value, width, maxWidth) + line, value = text.wrap(value, width, maxWidth) return line end end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index 5afbe46b7..8d708282b 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -42,42 +42,7 @@ local function read_history(handler, cursor, change) end end -local function tab_handler(handler, cursor) - local hints = handler.hint - if not hints then return end - local main_kb = tty.keyboard() - -- tty may not have a keyboard - -- in which case, we shouldn't be handling tab events - if not main_kb then - return - end - if not handler.cache then - handler.cache = type(hints) == "table" and hints or hints(cursor.data, cursor.index + 1) or {} - handler.cache.i = -1 - end - - local cache = handler.cache - - if #cache == 1 and cache.i == 0 then - -- there was only one solution, and the user is asking for the next - handler.cache = hints(cache[1], cursor.index + 1) - if not handler.cache then return end - handler.cache.i = -1 - cache = handler.cache - end - - local change = kb.isShiftDown(main_kb) and -1 or 1 - cache.i = (cache.i + change) % math.max(#cache, 1) - local next = cache[cache.i + 1] - if next then - local tail = unicode.len(cursor.data) - cursor.index - cursor:clear() - cursor:update(next) - cursor:move(-tail) - end -end - -local function key_down_handler(handler, cursor, char, code) +function tty.key_down_handler(handler, cursor, char, code) local c = false local backup_cache = handler.cache handler.cache = nil @@ -86,7 +51,7 @@ local function key_down_handler(handler, cursor, char, code) return --close elseif code == keys.tab then handler.cache = backup_cache - tab_handler(handler, cursor) + tty.on_tab(handler, cursor) elseif code == keys.enter or code == keys.numpadenter then cursor:move(math.huge) cursor:draw("\n") @@ -307,11 +272,6 @@ function tty.read(handler, cursor) checkArg(2, cursor, "table", "nil") handler.index = 0 - handler.touch = handler.touch or "touch_handler" - handler.drag = handler.drag or "touch_handler" - handler.clipboard = handler.clipboard or "clipboard_handler" - handler.key_down = handler.key_down or key_down_handler - cursor = cursor or tty.internal.build_vertical_reader() while true do @@ -329,11 +289,8 @@ function tty.read(handler, cursor) tty.drawText("^C\n") return false elseif address == main_kb or address == main_sc then - local handler_method = handler[name] + local handler_method = handler[name] or tty[name .. "_handler"] if handler_method then - if type(handler_method) == "string" then -- special hack to delay loading tty stuff - handler_method = tty[handler_method] - end -- nil to end (close) -- false to ignore -- true-thy updates cursor diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_tty.lua b/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_tty.lua index 7dcd499f1..67ab6b9e1 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_tty.lua @@ -1,7 +1,8 @@ local tty = require("tty") local unicode = require("unicode") +local kb = require("keyboard") -function tty.touch_handler(handler, cursor, gx, gy) +function tty.touch_handler(_, cursor, gx, gy) if cursor.data == "" then return false end @@ -33,8 +34,9 @@ function tty.touch_handler(handler, cursor, gx, gy) end return false -- no further cursor update end +tty.drag_handler = tty.touch_handler -function tty.clipboard_handler(handler, cursor, char, code) +function tty.clipboard_handler(handler, _, char, _) handler.cache = nil local first_line, end_index = char:find("\13?\10") if first_line then @@ -49,3 +51,38 @@ function tty.clipboard_handler(handler, cursor, char, code) return char end +function tty.on_tab(handler, cursor) + local hints = handler.hint + if not hints then return end + local main_kb = tty.keyboard() + -- tty may not have a keyboard + -- in which case, we shouldn't be handling tab events + if not main_kb then + return + end + if not handler.cache then + handler.cache = type(hints) == "table" and hints or hints(cursor.data, cursor.index + 1) or {} + handler.cache.i = -1 + end + + local cache = handler.cache + + if #cache == 1 and cache.i == 0 then + -- there was only one solution, and the user is asking for the next + handler.cache = hints(cache[1], cursor.index + 1) + if not handler.cache then return end + handler.cache.i = -1 + cache = handler.cache + end + + local change = kb.isShiftDown(main_kb) and -1 or 1 + cache.i = (cache.i + change) % math.max(#cache, 1) + local next = cache[cache.i + 1] + if next then + local tail = unicode.len(cursor.data) - cursor.index + cursor:clear() + cursor:update(next) + cursor:move(-tail) + end +end + diff --git a/src/main/resources/assets/opencomputers/loot/openos/usr/man/sh b/src/main/resources/assets/opencomputers/loot/openos/usr/man/sh index 9341521e6..bc6607c9f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/usr/man/sh +++ b/src/main/resources/assets/opencomputers/loot/openos/usr/man/sh @@ -13,17 +13,20 @@ DESCRIPTION Single quotes also suppress variable expansion. Per default, expressions like `$NAME` and `${NAME}` are expanded using environment variables (also accessible via the `os.getenv` method). - Basic globbing is supported, i.e. '*' and '?' are expanded approriately. For example: + Globbing is supported, i.e. '*' and '?' are expanded approriately. For example: ls b?n/ will list all files in `/bin/` (and, if it exists `/ban` and so on). cp /bin/* /usr/bin/ will copy all files from `/bin` to `/usr/bin`. - The shell provides basic redirects and piping: + The shell provides redirects and piping: cat f > f2 copies the contents of file `f` to `f2`, for example. echo 'this is a "test"' >> f2 will append the string 'this is a "test"' to the file `f2`. + 2>/dev/null ./some_program_with_errors + will redirect all stderr to /dev/null [i.e. supress errors]. + This example also demonstrates redirects can go at the front Redirects can be combined: cat < f >> f2 From f40bad3fba14ed398ffbe06a62f4b4f6233db1e6 Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 24 Jun 2017 20:25:45 -0700 Subject: [PATCH 15/37] protect env.load if defined, else use mt. simplify free by using io.write as print loads buffered_write --- .../opencomputers/loot/openos/bin/free.lua | 4 +-- .../loot/openos/boot/01_process.lua | 33 +++++++++++-------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/free.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/free.lua index ea3f6d0d0..cc637f3d4 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/free.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/free.lua @@ -1,8 +1,8 @@ local computer = require("computer") local total = computer.totalMemory() local max = 0 -for i=1,40 do +for _=1,40 do max = math.max(max, computer.freeMemory()) os.sleep(0) -- invokes gc end -print(string.format("Total%12d\nUsed%13d\nFree%13d", total, total - max, max)) +io.write(string.format("Total%12d\nUsed%13d\nFree%13d\n", total, total - max, max)) diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua index 9ae2e27be..6b9943e69 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/01_process.lua @@ -27,21 +27,26 @@ local intercept_load intercept_load = function(source, label, mode, env) if env then local prev_load = env.load or intercept_load - local env_mt = getmetatable(env) or {} - local env_mt_index = env_mt.__index - env_mt.__index = function(tbl, key) - if key == "load" then - return function(_source, _label, _mode, _env) - return prev_load(_source, _label, _mode, _env or env) - end - elseif type(env_mt_index) == "table" then - return env_mt_index[key] - elseif env_mt_index then - return env_mt_index(tbl, key) - end - return nil + local next_load = function(_source, _label, _mode, _env) + return prev_load(_source, _label, _mode, _env or env) + end + if rawget(env, "load") then -- overwrite load + env.load = next_load + else -- else it must be an __index load, or it didn't have one + local env_mt = getmetatable(env) or {} + local env_mt_index = env_mt.__index + env_mt.__index = function(tbl, key) + if key == "load" then + return next_load + elseif type(env_mt_index) == "table" then + return env_mt_index[key] + elseif env_mt_index then + return env_mt_index(tbl, key) + end + return nil + end + setmetatable(env, env_mt) end - setmetatable(env, env_mt) end return kernel_load(source, label, mode, env or process.info().env) end From 6a2586b536ccdd4da2901ae2acc0a1d335179d73 Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 24 Jun 2017 23:43:19 -0700 Subject: [PATCH 16/37] bisect filesystem lib for memory reduction to boot to shell --- .../loot/openos/boot/90_filesystem.lua | 2 + .../loot/openos/lib/filesystem.lua | 199 +++--------------- .../opencomputers/loot/openos/lib/package.lua | 12 +- .../opencomputers/loot/openos/lib/sh.lua | 1 - .../opencomputers/loot/openos/lib/text.lua | 1 - .../loot/openos/opt/core/full_filesystem.lua | 138 ++++++++++++ 6 files changed, 176 insertions(+), 177 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/loot/openos/opt/core/full_filesystem.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua index 5b0da6ca7..8c71f2cad 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua @@ -63,3 +63,5 @@ end event.listen("init", onInit) event.listen("component_added", onComponentAdded) event.listen("component_removed", onComponentRemoved) + +require("package").delay(fs, "/opt/core/full_filesystem.lua") diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua index 2346e7ae7..2171f4279 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua @@ -1,7 +1,7 @@ local component = require("component") local unicode = require("unicode") -local filesystem, fileStream = {}, {} +local filesystem = {} local isAutorunEnabled = nil local mtab = {name="", children={}, links={}} local fstab = {} @@ -116,8 +116,6 @@ function filesystem.setAutorunEnabled(value) saveConfig() end -filesystem.segments = segments - function filesystem.canonical(path) local result = table.concat(segments(path), "/") if unicode.sub(path, 1, 1) == "/" then @@ -165,45 +163,6 @@ function filesystem.realPath(path) return table.concat(parts, "/") end -function filesystem.isLink(path) - local name = filesystem.name(path) - local node, rest, vnode, vrest = findNode(filesystem.path(path), false, true) - if not node then return nil, rest end - local target = vnode.links[name] - -- having vrest here indicates we are not at the - -- owning vnode due to a mount point above this point - -- but we can have a target when there is a link at - -- the mount point root, with the same name - if not vrest and target ~= nil then - return true, target - end - return false -end - -function filesystem.link(target, linkpath) - checkArg(1, target, "string") - checkArg(2, linkpath, "string") - - if filesystem.exists(linkpath) then - return nil, "file already exists" - end - local linkpath_parent = filesystem.path(linkpath) - if not filesystem.exists(linkpath_parent) then - return nil, "no such directory" - end - local linkpath_real, reason = filesystem.realPath(linkpath_parent) - if not linkpath_real then - return nil, reason - end - if not filesystem.isDirectory(linkpath_real) then - return nil, "not a directory" - end - - local _, _, vnode, _ = findNode(linkpath_real, true) - vnode.links[filesystem.name(linkpath)] = target - return true -end - function filesystem.mount(fs, path) checkArg(1, fs, "string", "table") if type(fs) == "string" then @@ -260,17 +219,6 @@ function filesystem.mount(fs, path) return true end -function filesystem.mounts() - local tmp = {} - for path,node in pairs(fstab) do - table.insert(tmp, {node.fs,path}) - end - return function() - local next = table.remove(tmp) - if next then return table.unpack(next) end - end -end - function filesystem.path(path) local parts = segments(path) local result = table.concat(parts, "/", 1, #parts - 1) .. "/" @@ -306,33 +254,6 @@ function filesystem.proxy(filter) return component.proxy(address) end -function filesystem.umount(fsOrPath) - checkArg(1, fsOrPath, "string", "table") - local real - local fs - local addr - if type(fsOrPath) == "string" then - real = filesystem.realPath(fsOrPath) - addr = fsOrPath - else -- table - fs = fsOrPath - end - - local paths = {} - for path,node in pairs(fstab) do - if real == path or addr == node.fs.address or fs == node.fs then - table.insert(paths, path) - end - end - for _,path in ipairs(paths) do - local node = fstab[path] - fstab[path] = nil - node.fs = nil - node.parent.children[node.name] = nil - end - return #paths > 0 -end - function filesystem.exists(path) if not filesystem.realPath(filesystem.path(path)) then return false @@ -346,17 +267,6 @@ function filesystem.exists(path) return false end -function filesystem.size(path) - local node, rest, vnode, vrest = findNode(path, false, true) - if not node or not vnode.fs and (not vrest or vnode.links[vrest]) then - return 0 -- virtual directory or symlink - end - if node.fs and rest then - return node.fs.size(rest) - end - return 0 -- no such file or directory -end - function filesystem.isDirectory(path) local real, reason = filesystem.realPath(path) if not real then return nil, reason end @@ -370,17 +280,6 @@ function filesystem.isDirectory(path) return false end -function filesystem.lastModified(path) - local node, rest, vnode, vrest = findNode(path, false, true) - if not node or not vnode.fs and not vrest then - return 0 -- virtual directory - end - if node.fs and rest then - return node.fs.lastModified(rest) - end - return 0 -- no such file or directory -end - function filesystem.list(path) local node, rest, vnode, vrest = findNode(path, false, true) local result = {} @@ -410,24 +309,6 @@ function filesystem.list(path) end end -function filesystem.makeDirectory(path) - if filesystem.exists(path) then - return nil, "file or directory with that name already exists" - end - local node, rest = findNode(path) - if node.fs and rest then - local success, reason = node.fs.makeDirectory(rest) - if not success and not reason and node.fs.isReadOnly() then - reason = "filesystem is readonly" - end - return success, reason - end - if node.fs then - return nil, "virtual directory with that name already exists" - end - return nil, "cannot create a directory in a virtual directory" -end - function filesystem.remove(path) return require("tools/fsmod").remove(path, findNode) end @@ -436,53 +317,6 @@ function filesystem.rename(oldPath, newPath) return require("tools/fsmod").rename(oldPath, newPath, findNode) end -function filesystem.copy(fromPath, toPath) - local data = false - local input, reason = filesystem.open(fromPath, "rb") - if input then - local output, reason = filesystem.open(toPath, "wb") - if output then - repeat - data, reason = input:read(1024) - if not data then break end - data, reason = output:write(data) - if not data then data, reason = false, "failed to write" end - until not data - output:close() - end - input:close() - end - return data == nil, reason -end - -function fileStream:close() - if self.handle then - self.fs.close(self.handle) - self.handle = nil - end -end - -function fileStream:read(n) - if not self.handle then - return nil, "file is closed" - end - return self.fs.read(self.handle, n) -end - -function fileStream:seek(whence, offset) - if not self.handle then - return nil, "file is closed" - end - return self.fs.seek(self.handle, whence, offset) -end - -function fileStream:write(str) - if not self.handle then - return nil, "file is closed" - end - return self.fs.write(self.handle, str) -end - function filesystem.open(path, mode) checkArg(1, path, "string") mode = tostring(mode or "r") @@ -504,13 +338,36 @@ function filesystem.open(path, mode) return nil, reason end - local stream = {fs = node.fs, handle = handle} + local function create_handle_method(key) + return function(self, ...) + if not self.handle then + return nil, "file is closed" + end + return self.fs[key](self.handle, ...) + end + end - local metatable = {__index = fileStream, - __metatable = "filestream"} - return setmetatable(stream, metatable) + local stream = + { + fs = node.fs, + handle = handle, + close = function(self) + if self.handle then + self.fs.close(self.handle) + self.handle = nil + end + end + } + stream.read = create_handle_method("read") + stream.seek = create_handle_method("seek") + stream.write = create_handle_method("write") + return stream end +filesystem.findNode = findNode +filesystem.segments = segments +filesystem.fstab = fstab + ------------------------------------------------------------------------------- return filesystem diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua index ebecdfd77..3f356ebff 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua @@ -70,14 +70,18 @@ function require(module) end function package.delay(lib, file) - setmetatable(lib, - { + local mt = { __index = function(tbl, key) - setmetatable(tbl, nil) + setmetatable(lib, nil) + setmetatable(lib.internal or {}, nil) dofile(file) return tbl[key] end - }) + } + if lib.internal then + setmetatable(lib.internal, mt) + end + setmetatable(lib, mt) end ------------------------------------------------------------------------------- diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua index a17cf0ddd..3b699607f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua @@ -273,6 +273,5 @@ function sh.hintHandler(full_line, cursor) end require("package").delay(sh, "/opt/core/full_sh.lua") -require("package").delay(sh.internal, "/opt/core/full_sh.lua") return sh diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua index 764ba408f..1f527ebbb 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua @@ -145,6 +145,5 @@ function text.internal.words(input, options) end require("package").delay(text, "/opt/core/full_text.lua") -require("package").delay(text.internal, "/opt/core/full_text.lua") return text diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_filesystem.lua new file mode 100644 index 000000000..eee2ef421 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_filesystem.lua @@ -0,0 +1,138 @@ +local filesystem = require("filesystem") + +function filesystem.makeDirectory(path) + if filesystem.exists(path) then + return nil, "file or directory with that name already exists" + end + local node, rest = filesystem.findNode(path) + if node.fs and rest then + local success, reason = node.fs.makeDirectory(rest) + if not success and not reason and node.fs.isReadOnly() then + reason = "filesystem is readonly" + end + return success, reason + end + if node.fs then + return nil, "virtual directory with that name already exists" + end + return nil, "cannot create a directory in a virtual directory" +end + +function filesystem.lastModified(path) + local node, rest, vnode, vrest = filesystem.findNode(path, false, true) + if not node or not vnode.fs and not vrest then + return 0 -- virtual directory + end + if node.fs and rest then + return node.fs.lastModified(rest) + end + return 0 -- no such file or directory +end + +function filesystem.mounts() + local tmp = {} + for path,node in pairs(filesystem.fstab) do + table.insert(tmp, {node.fs,path}) + end + return function() + local next = table.remove(tmp) + if next then return table.unpack(next) end + end +end + +function filesystem.link(target, linkpath) + checkArg(1, target, "string") + checkArg(2, linkpath, "string") + + if filesystem.exists(linkpath) then + return nil, "file already exists" + end + local linkpath_parent = filesystem.path(linkpath) + if not filesystem.exists(linkpath_parent) then + return nil, "no such directory" + end + local linkpath_real, reason = filesystem.realPath(linkpath_parent) + if not linkpath_real then + return nil, reason + end + if not filesystem.isDirectory(linkpath_real) then + return nil, "not a directory" + end + + local _, _, vnode, _ = filesystem.findNode(linkpath_real, true) + vnode.links[filesystem.name(linkpath)] = target + return true +end + +function filesystem.umount(fsOrPath) + checkArg(1, fsOrPath, "string", "table") + local real + local fs + local addr + if type(fsOrPath) == "string" then + real = filesystem.realPath(fsOrPath) + addr = fsOrPath + else -- table + fs = fsOrPath + end + + local paths = {} + for path,node in pairs(filesystem.fstab) do + if real == path or addr == node.fs.address or fs == node.fs then + table.insert(paths, path) + end + end + for _,path in ipairs(paths) do + local node = filesystem.fstab[path] + filesystem.fstab[path] = nil + node.fs = nil + node.parent.children[node.name] = nil + end + return #paths > 0 +end + +function filesystem.size(path) + local node, rest, vnode, vrest = filesystem.findNode(path, false, true) + if not node or not vnode.fs and (not vrest or vnode.links[vrest]) then + return 0 -- virtual directory or symlink + end + if node.fs and rest then + return node.fs.size(rest) + end + return 0 -- no such file or directory +end + +function filesystem.isLink(path) + local name = filesystem.name(path) + local node, rest, vnode, vrest = filesystem.findNode(filesystem.path(path), false, true) + if not node then return nil, rest end + local target = vnode.links[name] + -- having vrest here indicates we are not at the + -- owning vnode due to a mount point above this point + -- but we can have a target when there is a link at + -- the mount point root, with the same name + if not vrest and target ~= nil then + return true, target + end + return false +end + +function filesystem.copy(fromPath, toPath) + local data = false + local input, reason = filesystem.open(fromPath, "rb") + if input then + local output, reason = filesystem.open(toPath, "wb") + if output then + repeat + data, reason = input:read(1024) + if not data then break end + data, reason = output:write(data) + if not data then data, reason = false, "failed to write" end + until not data + output:close() + end + input:close() + end + return data == nil, reason +end + From e3525d9a00f85d2626e8ce1775e42bfd78f57387 Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 25 Jun 2017 09:11:20 -0700 Subject: [PATCH 17/37] safer to try to load a library full before removing metatable in case of oom --- .../resources/assets/opencomputers/loot/openos/lib/package.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua index 3f356ebff..394247935 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/package.lua @@ -72,9 +72,9 @@ end function package.delay(lib, file) local mt = { __index = function(tbl, key) + dofile(file) setmetatable(lib, nil) setmetatable(lib.internal or {}, nil) - dofile(file) return tbl[key] end } From dc7a1940201c29c99c841b04b0a37208728bb44d Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 25 Jun 2017 09:31:58 -0700 Subject: [PATCH 18/37] moving /opt/core to /lib/core --- .../assets/opencomputers/loot/openos/bin/install.lua | 2 +- .../assets/opencomputers/loot/openos/bin/ls.lua | 2 +- .../assets/opencomputers/loot/openos/bin/lua.lua | 2 +- .../assets/opencomputers/loot/openos/bin/mount.lua | 6 +++--- .../opencomputers/loot/openos/boot/90_filesystem.lua | 2 +- .../assets/opencomputers/loot/openos/init.lua | 2 +- .../loot/openos/{opt => lib}/core/boot.lua | 0 .../loot/openos/{opt => lib}/core/devfs/01_hw.lua | 3 +-- .../loot/openos/{opt => lib}/core/devfs/02_utils.lua | 0 .../{opt => lib}/core/devfs/adapters/computer.lua | 0 .../{opt => lib}/core/devfs/adapters/eeprom.lua | 0 .../{opt => lib}/core/devfs/adapters/filesystem.lua | 0 .../openos/{opt => lib}/core/devfs/adapters/gpu.lua | 0 .../{opt => lib}/core/devfs/adapters/internet.lua | 0 .../{opt => lib}/core/devfs/adapters/modem.lua | 0 .../{opt => lib}/core/devfs/adapters/screen.lua | 0 .../openos/{opt => lib}/core/device_labeling.lua | 0 .../openos/{opt => lib}/core/full_filesystem.lua | 0 .../loot/openos/{opt => lib}/core/full_keyboard.lua | 0 .../loot/openos/{opt => lib}/core/full_ls.lua | 0 .../loot/openos/{opt => lib}/core/full_sh.lua | 0 .../loot/openos/{opt => lib}/core/full_text.lua | 0 .../openos/{opt => lib}/core/full_transforms.lua | 0 .../loot/openos/{opt => lib}/core/full_tty.lua | 0 .../loot/openos/{opt => lib}/core/install_basics.lua | 2 +- .../loot/openos/{opt => lib}/core/install_utils.lua | 0 .../loot/openos/{opt => lib}/core/lua_shell.lua | 0 .../loot/openos/{opt => lib}/core/ro_wrapper.lua | 0 .../assets/opencomputers/loot/openos/lib/devfs.lua | 4 ++-- .../opencomputers/loot/openos/lib/keyboard.lua | 2 +- .../assets/opencomputers/loot/openos/lib/sh.lua | 2 +- .../assets/opencomputers/loot/openos/lib/text.lua | 8 ++++---- .../opencomputers/loot/openos/lib/transforms.lua | 2 +- .../assets/opencomputers/loot/openos/lib/tty.lua | 12 ++++++------ 34 files changed, 25 insertions(+), 26 deletions(-) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/boot.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/01_hw.lua (97%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/02_utils.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/adapters/computer.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/adapters/eeprom.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/adapters/filesystem.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/adapters/gpu.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/adapters/internet.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/adapters/modem.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/devfs/adapters/screen.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/device_labeling.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/full_filesystem.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/full_keyboard.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/full_ls.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/full_sh.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/full_text.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/full_transforms.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/full_tty.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/install_basics.lua (99%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/install_utils.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/lua_shell.lua (100%) rename src/main/resources/assets/opencomputers/loot/openos/{opt => lib}/core/ro_wrapper.lua (100%) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/install.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/install.lua index 2358ada49..f8410e98b 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/install.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/install.lua @@ -4,7 +4,7 @@ local shell = require("shell") local options do - local basic, reason = loadfile("/opt/core/install_basics.lua", "bt", _G) + local basic, reason = loadfile("/lib/core/install_basics.lua", "bt", _G) if not basic then io.stderr:write("failed to load install: " .. tostring(reason) .. "\n") return 1 diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/ls.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/ls.lua index 4a3db6f9c..25a67968f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/ls.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/ls.lua @@ -1,7 +1,7 @@ -- load complex, if we can (might be low on memory) local ok, why = pcall(function(...) - return loadfile("/opt/core/full_ls.lua", "bt", _G)(...) + return loadfile("/lib/core/full_ls.lua", "bt", _G)(...) end, ...) if not ok then diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/lua.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/lua.lua index ebd25f995..d534865df 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/lua.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/lua.lua @@ -2,7 +2,7 @@ local shell = require("shell") local args = shell.parse(...) if #args == 0 then - args = {"/opt/core/lua_shell.lua"} + args = {"/lib/core/lua_shell.lua"} end local filename = args[1] diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/mount.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/mount.lua index cfc92bff9..de5eb75b7 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/mount.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/mount.lua @@ -55,12 +55,12 @@ else io.stderr:write(reason,"\n") return 1 elseif ops.r then - proxy = dofile("/opt/core/ro_wrapper.lua").wrap(proxy) + proxy = dofile("/lib/core/ro_wrapper.lua").wrap(proxy) end - local result, reason = fs.mount(proxy, shell.resolve(args[2])) + local result, mount_failure = fs.mount(proxy, shell.resolve(args[2])) if not result then - io.stderr:write(reason,"\n") + io.stderr:write(mount_failure, "\n") return 2 -- error code end end diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua index 8c71f2cad..5e21ed7ed 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/90_filesystem.lua @@ -64,4 +64,4 @@ event.listen("init", onInit) event.listen("component_added", onComponentAdded) event.listen("component_removed", onComponentRemoved) -require("package").delay(fs, "/opt/core/full_filesystem.lua") +require("package").delay(fs, "/lib/core/full_filesystem.lua") diff --git a/src/main/resources/assets/opencomputers/loot/openos/init.lua b/src/main/resources/assets/opencomputers/loot/openos/init.lua index 28d4ba670..0e7b102a6 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/init.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/init.lua @@ -13,7 +13,7 @@ do invoke(addr, "close", handle) return load(buffer, "=" .. file, "bt", _G) end]], "=loadfile", "bt", _G)() - loadfile("/opt/core/boot.lua")(loadfile) + loadfile("/lib/core/boot.lua")(loadfile) end while true do diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/boot.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/boot.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/01_hw.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/01_hw.lua similarity index 97% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/01_hw.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/01_hw.lua index cc4712124..50e4a3147 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/01_hw.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/01_hw.lua @@ -1,10 +1,9 @@ local comp = require("component") -local fs = require("filesystem") local text = require("text") local dcache = {} local pcache = {} -local adapter_pwd = "/opt/core/devfs/adapters/" +local adapter_pwd = "/lib/core/devfs/adapters/" local adapter_api = {} diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/02_utils.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/02_utils.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/02_utils.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/02_utils.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/computer.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/computer.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/computer.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/computer.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/eeprom.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/eeprom.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/eeprom.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/eeprom.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/filesystem.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/filesystem.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/filesystem.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/gpu.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/gpu.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/gpu.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/gpu.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/internet.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/internet.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/internet.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/internet.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/modem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/modem.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/modem.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/modem.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/screen.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/screen.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/devfs/adapters/screen.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/adapters/screen.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/device_labeling.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/device_labeling.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/device_labeling.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/device_labeling.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_filesystem.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/full_filesystem.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_filesystem.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_keyboard.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_keyboard.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/full_keyboard.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_keyboard.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_ls.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/full_ls.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_sh.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_sh.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/full_sh.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_sh.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_text.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_text.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/full_text.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_text.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_transforms.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_transforms.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/full_transforms.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_transforms.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/full_tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_tty.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/full_tty.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_tty.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/install_basics.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua similarity index 99% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/install_basics.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua index 7e4c21be6..6673f1a76 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/opt/core/install_basics.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua @@ -22,7 +22,7 @@ if options.help then return nil -- exit success end -local utils_path = "/opt/core/install_utils.lua" +local utils_path = "/lib/core/install_utils.lua" local utils local rootfs = fs.get("/") diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/install_utils.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/install_utils.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/lua_shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/lua_shell.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/opt/core/ro_wrapper.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/ro_wrapper.lua similarity index 100% rename from src/main/resources/assets/opencomputers/loot/openos/opt/core/ro_wrapper.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/ro_wrapper.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/devfs.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/devfs.lua index c1ef26203..66cbb26a5 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/devfs.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/devfs.lua @@ -153,7 +153,7 @@ inject_dynamic_pairs = function(fsnode, path, bStoreUse) }) end -local label_lib = dofile("/opt/core/device_labeling.lua") +local label_lib = dofile("/lib/core/device_labeling.lua") label_lib.loadRules() api.getDeviceLabel = label_lib.getDeviceLabel api.setDeviceLabel = label_lib.setDeviceLabel @@ -163,7 +163,7 @@ function api.register(public_proxy) if registered then return end registered = true - local start_path = "/opt/core/devfs/" + local start_path = "/lib/core/devfs/" for starter in fs.list(start_path) do local full_path = start_path .. starter local _,matched = starter:gsub("%.lua$","") diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua index 910a5ca94..70d86893f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua @@ -82,6 +82,6 @@ end ------------------------------------------------------------------------------- -require("package").delay(keyboard.keys, "/opt/core/full_keyboard.lua") +require("package").delay(keyboard.keys, "/lib/core/full_keyboard.lua") return keyboard diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua index 3b699607f..1f923161e 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/sh.lua @@ -272,6 +272,6 @@ function sh.hintHandler(full_line, cursor) return sh.internal.hintHandlerImpl(full_line, cursor) end -require("package").delay(sh, "/opt/core/full_sh.lua") +require("package").delay(sh, "/lib/core/full_sh.lua") return sh diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua index 1f527ebbb..7c77f4041 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/text.lua @@ -89,10 +89,10 @@ function text.internal.words(input, options) local show_escapes = options.show_escapes local qr = nil quotes = quotes or {{"'","'",true},{'"','"'},{'`','`'}} - local function append(dst, txt, qr) + local function append(dst, txt, _qr) local size = #dst - if size == 0 or dst[size].qr ~= qr then - dst[size+1] = {txt=txt, qr=qr} + if size == 0 or dst[size].qr ~= _qr then + dst[size+1] = {txt=txt, qr=_qr} else dst[size].txt = dst[size].txt..txt end @@ -144,6 +144,6 @@ function text.internal.words(input, options) return tokens end -require("package").delay(text, "/opt/core/full_text.lua") +require("package").delay(text, "/lib/core/full_text.lua") return text diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/transforms.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/transforms.lua index 11e859564..f34a6b6c7 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/transforms.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/transforms.lua @@ -70,6 +70,6 @@ function lib.concat(...) return r end -require("package").delay(lib, "/opt/core/full_transforms.lua") +require("package").delay(lib, "/lib/core/full_transforms.lua") return lib diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index 8d708282b..c074b8f7d 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -215,14 +215,14 @@ function tty.internal.build_vertical_reader() end end, clear_tail = function(_) - local oi, width, height, dx, dy, ox, oy = _.index, tty.getViewport() + local oi, width, _, dx, dy, ox, oy = _.index, tty.getViewport() _:move(math.huge) _:move(-1) - local ex, ey = tty.getCursor() + local _, ey = tty.getCursor() tty.setCursor(ox, oy) _.index = oi - local x = oy == ey and ox or 1 - tty.gpu().fill(x + dx, ey + dy, width - x + 1, 1, " ") + local cx = oy == ey and ox or 1 + tty.gpu().fill(cx + dx, ey + dy, width - cx + 1, 1, " ") end, update = function(_, arg) local s1, s2 = tty.internal.split(_) @@ -337,7 +337,7 @@ function tty.drawText(value, nowrap) local uptime = computer.uptime local last_sleep = uptime() local last_index = 1 - local width, height, dx, dy = tty.getViewport() + local width, _, dx, dy = tty.getViewport() while true do if uptime() - last_sleep > 1 then os.sleep(0) @@ -493,6 +493,6 @@ function tty.scroll(number) return lines end -require("package").delay(tty, "/opt/core/full_tty.lua") +require("package").delay(tty, "/lib/core/full_tty.lua") return tty From 5d81f515703835509b7f6bbd3102b89572d27321 Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 25 Jun 2017 10:03:15 -0700 Subject: [PATCH 19/37] rename _ as self in tty cursor as it should be and move tty.write to term.write --- .../opencomputers/loot/openos/bin/sh.lua | 2 +- .../loot/openos/lib/core/lua_shell.lua | 15 ++-- .../opencomputers/loot/openos/lib/term.lua | 11 +++ .../opencomputers/loot/openos/lib/tty.lua | 77 ++++++++----------- 4 files changed, 52 insertions(+), 53 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua index aa8d94538..f62987d1f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua @@ -28,7 +28,7 @@ if #args == 0 and (io.stdin.tty or options.i) and not options.c then local gpu = tty.gpu() while tty.isAvailable() do local foreground = gpu.setForeground(0xFF0000) - tty.write(sh.expand(os.getenv("PS1") or "$ ")) + io.write(sh.expand(os.getenv("PS1") or "$ ")) gpu.setForeground(foreground) tty.setCursorBlink(true) local command = tty.read(history) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua index 053f2ae48..7a29d3300 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua @@ -1,6 +1,5 @@ local package = require("package") local tty = require("tty") -local process = require("process") local gpu = tty.gpu() @@ -92,16 +91,16 @@ function read_handler.hint(line, index) end gpu.setForeground(0xFFFFFF) -tty.write(_VERSION .. " Copyright (C) 1994-2017 Lua.org, PUC-Rio\n") +io.write(_VERSION .. " Copyright (C) 1994-2017 Lua.org, PUC-Rio\n") gpu.setForeground(0xFFFF00) -tty.write("Enter a statement and hit enter to evaluate it.\n") -tty.write("Prefix an expression with '=' to show its value.\n") -tty.write("Press Ctrl+D to exit the interpreter.\n") +io.write("Enter a statement and hit enter to evaluate it.\n") +io.write("Prefix an expression with '=' to show its value.\n") +io.write("Press Ctrl+D to exit the interpreter.\n") gpu.setForeground(0xFFFFFF) while tty.isAvailable() do local foreground = gpu.setForeground(0x00FF00) - tty.write(env._PROMPT) + io.write(env._PROMPT) gpu.setForeground(foreground) local command = tty.read(read_handler) if not command then -- eof @@ -122,10 +121,10 @@ while tty.isAvailable() do io.stderr:write(tostring(result[2]) .. "\n") else for i = 2, result.n do - tty.write(require("serialization").serialize(result[i], true) .. "\t", true) + io.write(require("serialization").serialize(result[i], true) .. "\t", true) end if tty.getCursor() > 1 then - tty.write("\n") + io.write("\n") end end else diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua index cd1021d21..826d96d03 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua @@ -182,6 +182,17 @@ local function inject_mask(cursor, dobreak, pwchar) end end +-- cannot use term.write = io.write because io.write invokes metatable +function term.write(value, wrap) + local stdout = io.output() + local stream = stdout and stdout.stream + local previous_nowrap = stream.nowrap + stream.nowrap = wrap == false + stdout:write(value) + stdout:flush() + stream.nowrap = previous_nowrap +end + function term.read(history, dobreak, hint, pwchar, filter) if not io.stdin.tty then return io.read("*L") diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index c074b8f7d..7a2d1b1b4 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -192,16 +192,16 @@ function tty.internal.build_vertical_reader() index = 0, data = "", sy = 0, - scroll = function(_) - _.sy = _.sy + tty.scroll() + scroll = function(self) + self.sy = self.sy + tty.scroll() end, - move = function(_,n) + move = function(self, n) local win = tty.window - _.index = math.min(math.max(0,_.index + n), unicode.len(_.data)) - local s1, s2 = tty.internal.split(_) + self.index = math.min(math.max(0, self.index + n), unicode.len(self.data)) + local s1, s2 = tty.internal.split(self) s2 = unicode.sub(s2.." ", 1, 1) - local data_remaining = ("_"):rep(_.promptx - 1)..s1..s2 - win.y = _.prompty - _.sy + local data_remaining = ("_"):rep(self.promptx - 1)..s1..s2 + win.y = self.prompty - self.sy while true do local wlen_remaining = unicode.wlen(data_remaining) if wlen_remaining > win.width then @@ -214,53 +214,53 @@ function tty.internal.build_vertical_reader() end end end, - clear_tail = function(_) - local oi, width, _, dx, dy, ox, oy = _.index, tty.getViewport() - _:move(math.huge) - _:move(-1) + clear_tail = function(self) + local oi, width, _, dx, dy, ox, oy = self.index, tty.getViewport() + self:move(math.huge) + self:move(-1) local _, ey = tty.getCursor() tty.setCursor(ox, oy) - _.index = oi + self.index = oi local cx = oy == ey and ox or 1 tty.gpu().fill(cx + dx, ey + dy, width - cx + 1, 1, " ") end, - update = function(_, arg) - local s1, s2 = tty.internal.split(_) + update = function(self, arg) + local s1, s2 = tty.internal.split(self) if type(arg) == "string" then - _.data = s1 .. arg .. s2 - _.index = _.index + unicode.len(arg) - _:draw(arg) + self.data = s1 .. arg .. s2 + self.index = self.index + unicode.len(arg) + self:draw(arg) else -- number if arg < 0 then -- backspace? ignore if at start - if _.index <= 0 then return end - _:move(arg) + if self.index <= 0 then return end + self:move(arg) s1 = unicode.sub(s1, 1, -1 + arg) else -- forward? ignore if at end - if _.index >= unicode.len(_.data) then return end + if self.index >= unicode.len(self.data) then return end s2 = unicode.sub(s2, 1 + arg) end - _:clear_tail() - _.data = s1 .. s2 + self:clear_tail() + self.data = s1 .. s2 end -- redraw suffix if s2 ~= "" then - local ps, px, py = _.sy, tty.getCursor() - _:draw(s2) - tty.setCursor(px, py - (_.sy - ps)) + local ps, px, py = self.sy, tty.getCursor() + self:draw(s2) + tty.setCursor(px, py - (self.sy - ps)) end end, - clear = function(_) - _:move(-math.huge) - _:draw((" "):rep(unicode.wlen(_.data))) - _:move(-math.huge) - _.index = 0 - _.data = "" + clear = function(self) + self:move(-math.huge) + self:draw((" "):rep(unicode.wlen(self.data))) + self:move(-math.huge) + self.index = 0 + self.data = "" end, - draw = function(_, text) - _.sy = _.sy + tty.drawText(text) + draw = function(self, text) + self.sy = self.sy + tty.drawText(text) end } end @@ -306,17 +306,6 @@ function tty.read(handler, cursor) end end --- cannot use tty.write = io.write because io.write invokes metatable -function tty.write(value, wrap) - local stdout = io.output() - local stream = stdout and stdout.stream - local previous_nowrap = stream.nowrap - stream.nowrap = wrap == false - stdout:write(value) - stdout:flush() - stream.nowrap = previous_nowrap -end - function tty.getCursor() local window = tty.window return window.x, window.y From 83a37af8cbdbe43aa4ac73eac43d4c6169f065ad Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 25 Jun 2017 16:18:16 -0700 Subject: [PATCH 20/37] woops - lua_shell using io.write doesn't need to pass true to wrap --- .../assets/opencomputers/loot/openos/lib/core/lua_shell.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua index 7a29d3300..64a2bdcf1 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua @@ -121,7 +121,7 @@ while tty.isAvailable() do io.stderr:write(tostring(result[2]) .. "\n") else for i = 2, result.n do - io.write(require("serialization").serialize(result[i], true) .. "\t", true) + io.write(require("serialization").serialize(result[i], true) .. "\t") end if tty.getCursor() > 1 then io.write("\n") From c988b44f669d49b489b98570e643c1e7b0baf5d4 Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 25 Jun 2017 22:58:54 -0700 Subject: [PATCH 21/37] openos 1.6.6 More memory savings, significant boot time savings **Memory Savings** The largest library in terms of cost in bytes in 1.6.5 was /lib/filesystem. Most of this library is not needed for boot, and in 1.6.6 the library is half loaded for boot with a delay load of the rest of the library when needed. There are also other minor memory improvements, see **Changes** for details **Boot Time** This update also introduces a newly written /bin/sh.lua that takes advantage of a common stdio system. This work was primary done to reduce memory needed to load the shell. However, during development of a simplified /bin/sh, I found that the /bin/source, /etc/profile, and /home/.shrc feature added to openos 1.6 had a significant boot time cost. I began optimizing /bin/source heavily and found that I could not make sufficient speed improvements due to the nature of how shell commands execute. Thus /etc/profile has been removed in favor of /etc/profile.lua, a script that sets up the environment the same but as a lua script. ~/.shrc is still honored if it exists on a system, and is sourced (/bin/source) as a set of shell commands. This change speeds up boot time from floppy by 3s, and on hdds by 1s. **Possible Breaking Changes** /etc/profile has been moved to /etc/profile.lua, but /home/.shrc is still sourced as shell script commands. **Changes** * /bin/sh.lua rewrite that takes advantage of standard io and uses the new /etc/profile.lua shaving 6s off boot time * /bin/source.lua improve performance by reducing the number of processes created * move /etc/profile to /etc/profile.lua and recode the actions in lua-form. * move all ~/.shrc actions to /etc/profile.lua for performance reasons * move motd to start of /etc/profile.lua to get the shell display as soon as possible * update greetings that referenced /etc/profile to properly refer to /etc/profile.lua now * update openos version to 1.6.6 to respect the impact of these changes --- .../opencomputers/loot/openos/bin/alias.lua | 4 +- .../opencomputers/loot/openos/bin/more.lua | 5 +- .../opencomputers/loot/openos/bin/sh.lua | 62 +++++++------------ .../opencomputers/loot/openos/bin/source.lua | 33 +++++----- .../loot/openos/boot/00_base.lua | 4 +- .../opencomputers/loot/openos/etc/profile | 26 -------- .../opencomputers/loot/openos/etc/profile.lua | 38 ++++++++++++ .../opencomputers/loot/openos/home/.shrc | 5 -- .../loot/openos/lib/core/boot.lua | 2 +- .../loot/openos/lib/core/full_ls.lua | 8 +-- .../opencomputers/loot/openos/lib/shell.lua | 4 +- .../loot/openos/usr/misc/greetings.txt | 2 +- 12 files changed, 90 insertions(+), 103 deletions(-) delete mode 100644 src/main/resources/assets/opencomputers/loot/openos/etc/profile create mode 100644 src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/alias.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/alias.lua index a9594a447..4e25b6d6e 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/alias.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/alias.lua @@ -4,7 +4,7 @@ local args, options = shell.parse(...) local ec, error_prefix = 0, "alias:" if options.help then - print(string.format("Usage: alias: [name[=value] ... ]", cmd_name)) + print(string.format("Usage: alias: [name[=value] ... ]")) return end @@ -53,7 +53,7 @@ if not next(args) then -- no args print(string.format("alias %s='%s'", k, v)) end else - for k,v in pairs(args) do + for _,v in ipairs(args) do checkArg(1,v,"string") handlePair(splitPair(v)) end diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/more.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/more.lua index af1150c1d..dfc3d55f6 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/more.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/more.lua @@ -2,7 +2,6 @@ local keyboard = require("keyboard") local shell = require("shell") local term = require("term") -- TODO use tty and cursor position instead of global area and gpu local text = require("text") -local unicode = require("unicode") if not io.output().tty then return loadfile(shell.resolve("cat", "lua"), "bt", _G)(...) @@ -28,7 +27,7 @@ end local line = nil local function readlines(num) - local x, y, w, h = term.getGlobalArea() + local _, _, w, h = term.getGlobalArea() num = num or (h - 1) for _ = 1, num do if not line then @@ -52,7 +51,7 @@ while true do return end while true do - local event, address, char, code = term.pull("key_down") + local _, _, _, code = term.pull("key_down") if code == keyboard.keys.q then term.clearLine() return diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua index f62987d1f..337656e0a 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua @@ -5,70 +5,50 @@ local text = require("text") local sh = require("sh") local input = table.pack(...) -local args, options = shell.parse(select(3,table.unpack(input))) +local args = shell.parse(select(3,table.unpack(input))) if input[2] then table.insert(args, 1, input[2]) end local history = {hint = sh.hintHandler} shell.prime() +local update_gpu = io.output().tty +local interactive = io.input().tty +local foreground -if #args == 0 and (io.stdin.tty or options.i) and not options.c then - -- interactive shell. - -- source profile - if not tty.isAvailable() then event.pull("term_available") end - loadfile(shell.resolve("source","lua"))("/etc/profile") +if #args == 0 then while true do - if not tty.isAvailable() then -- don't clear unless we lost the term + if update_gpu then while not tty.isAvailable() do event.pull("term_available") end - tty.clear() - end - local gpu = tty.gpu() - while tty.isAvailable() do - local foreground = gpu.setForeground(0xFF0000) - io.write(sh.expand(os.getenv("PS1") or "$ ")) - gpu.setForeground(foreground) - tty.setCursorBlink(true) - local command = tty.read(history) - if not command then - if command == false then - break -- soft interrupt - end - io.write("exit\n") -- pipe closed - return -- eof + if not foreground and interactive then -- first time run AND interactive + dofile("/etc/profile.lua") end + foreground = tty.gpu().setForeground(0xFF0000) + io.write(sh.expand(os.getenv("PS1") or "$ ")) + tty.gpu().setForeground(foreground) + tty.setCursorBlink(true) + end + local command = tty.read(history) + if command then command = text.trim(command) if command == "exit" then return elseif command ~= "" then local result, reason = sh.execute(_ENV, command) - if tty.getCursor() > 1 then - print() + if update_gpu and tty.getCursor() > 1 then + io.write("\n") end if not result then io.stderr:write((reason and tostring(reason) or "unknown error") .. "\n") end end - end - end -elseif #args == 0 and not io.stdin.tty then - while true do - io.write(sh.expand(os.getenv("PS1") or "$ ")) - local command = io.read("*l") - if not command then - command = "exit" - io.write(command,"\n") - end - command = text.trim(command) - if command == "exit" then - return - elseif command ~= "" then - local result, reason = os.execute(command) - if not result then - io.stderr:write((reason and tostring(reason) or "unknown error") .. "\n") + elseif command == nil then -- command==false is a soft interrupt, ignore it + if interactive then + io.write("exit\n") -- pipe closed end + return -- eof end end else diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/source.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/source.lua index a1b040716..2b1cc20ec 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/source.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/source.lua @@ -1,6 +1,5 @@ local shell = require("shell") -local fs = require("filesystem") -local sh = require("sh") +local process = require("process") local args, options = shell.parse(...) @@ -9,23 +8,25 @@ if #args ~= 1 then return 1 end -local file, reason = io.open(args[1], "r") +local file, open_reason = io.open(args[1], "r") if not file then if not options.q then - io.stderr:write(string.format("could not source %s because: %s\n", args[1], reason)); + io.stderr:write(string.format("could not source %s because: %s\n", args[1], open_reason)); end return 1 -else - local status, reason = xpcall(function() - repeat - local line = file:read() - if line then - sh.execute(nil, line) - end - until not line - end, function(msg) return {msg, debug.traceback()} end) - - file:close() - if not status and reason then assert(false, tostring(reason[1]) .."\n".. tostring(reason[2])) end end + +local current_data = process.info().data + +local source_proc = process.load((assert(os.getenv("SHELL"), "no $SHELL set"))) +local source_data = process.list[source_proc].data +source_data.aliases = current_data.aliases -- hacks to propogate sub shell env changes +source_data.vars = current_data.vars +source_data.io[0] = file -- set stdin to the file +if options.q then + source_data.io[1] = {tty=false,write=function()end} -- set stdin to the file +end +process.internal.continue(source_proc) + +file:close() -- should have closed when the process closed, but just to be sure diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua index 76c4c04ae..c8a56ac4b 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/00_base.lua @@ -2,9 +2,9 @@ function loadfile(filename, ...) if filename:sub(1,1) ~= "/" then filename = (os.getenv("PWD") or "/") .. "/" .. filename end - local handle, reason = require("filesystem").open(filename) + local handle, open_reason = require("filesystem").open(filename) if not handle then - return nil, reason + return nil, open_reason end local buffer = {} while true do diff --git a/src/main/resources/assets/opencomputers/loot/openos/etc/profile b/src/main/resources/assets/opencomputers/loot/openos/etc/profile deleted file mode 100644 index a2a387f00..000000000 --- a/src/main/resources/assets/opencomputers/loot/openos/etc/profile +++ /dev/null @@ -1,26 +0,0 @@ -alias dir=ls -alias move=mv -alias rename=mv -alias copy=cp -alias del=rm -alias md=mkdir -alias cls=clear -alias rs=redstone -alias view=edit\ -r -alias help=man -alias cp=cp\ -i - -set EDITOR=/bin/edit -set HISTSIZE=10 -set HOME=/home -set IFS=\ -set MANPATH=/usr/man:. -set PAGER=/bin/more -set PS1='$HOSTNAME$HOSTNAME_SEPARATOR$PWD # ' -set PWD=/ -set LS_COLORS="{FILE=0xFFFFFF,DIR=0x66CCFF,LINK=0xFFAA00,['*.lua']=0x00FF00}" - -cd $HOME -clear -/etc/motd -source $HOME/.shrc -q diff --git a/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua new file mode 100644 index 000000000..400f3485e --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua @@ -0,0 +1,38 @@ +local shell = require("shell") +local tty = require("tty") +local fs = require("filesystem") + +tty.clear() +dofile("/etc/motd") + +shell.setAlias("dir", "ls") +shell.setAlias("move", "mv") +shell.setAlias("rename", "mv") +shell.setAlias("copy", "cp") +shell.setAlias("del", "rm") +shell.setAlias("md", "mkdir") +shell.setAlias("cls", "clear") +shell.setAlias("rs", "redstone") +shell.setAlias("view", "edit -r") +shell.setAlias("help", "man") +shell.setAlias("cp", "cp -i") +shell.setAlias("l", "ls -lhp") +shell.setAlias("..", "cd ..") +shell.setAlias("df", "df -h") +shell.setAlias("grep", "grep --color") + +os.setenv("EDITOR", "/bin/edit") +os.setenv("HISTSIZE", "10") +os.setenv("HOME", "/home") +os.setenv("IFS", " ") +os.setenv("MANPATH", "/usr/man:.") +os.setenv("PAGER", "/bin/more") +os.setenv("PS1", "$HOSTNAME$HOSTNAME_SEPARATOR$PWD # ") +os.setenv("LS_COLORS", "{FILE=0xFFFFFF,DIR=0x66CCFF,LINK=0xFFAA00,['*.lua']=0x00FF00}") + +shell.setWorkingDirectory(os.getenv("HOME")) + +local home_shrc = shell.resolve(".shrc") +if fs.exists(home_shrc) then + loadfile(shell.resolve("source", "lua"))(home_shrc, "-q") +end diff --git a/src/main/resources/assets/opencomputers/loot/openos/home/.shrc b/src/main/resources/assets/opencomputers/loot/openos/home/.shrc index e9e55efa7..e69de29bb 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/home/.shrc +++ b/src/main/resources/assets/opencomputers/loot/openos/home/.shrc @@ -1,5 +0,0 @@ -alias l="ls -lhp" -alias ..="cd .." -alias df="df -h" - -alias grep="grep --color" diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua index 7ad88d429..ed45c023a 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua @@ -1,7 +1,7 @@ -- called from /init.lua local raw_loadfile = ... -_G._OSVERSION = "OpenOS 1.6.5" +_G._OSVERSION = "OpenOS 1.6.6" local component = component local computer = computer diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua index 8f6524305..5e7eb6bec 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua @@ -253,7 +253,7 @@ local function display(names) max_size_width = math.max(max_size_width, formatSize(info.size):len()) max_date_width = math.max(max_date_width, formatDate(info.time):len()) end - mt.__index = function(tbl, index) + mt.__index = function(_, index) local info = stat(names, index) local file_type = info.isLink and 'l' or info.isDir and 'd' or 'f' local link_target = info.isLink and string.format(" -> %s", info.link:gsub("/+$", "") .. (info.isDir and "/" or "")) or "" @@ -267,7 +267,7 @@ local function display(names) end elseif ops["1"] or not fOut then lines.n = #names - mt.__index = function(tbl, index) + mt.__index = function(_, index) local info = stat(names, index) return {{color = colorize(info), name = info.name}} end @@ -302,10 +302,10 @@ local function display(names) end end lines.n = items_per_column - mt.__index=function(tbl, line_index) + mt.__index=function(_, line_index) return setmetatable({},{ __len=function()return num_columns end, - __index=function(tbl, column_index) + __index=function(_, column_index) local ri = real(column_index, line_index) if not ri then return end local info = stat(names, ri) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua index ea536a71a..0a9dc2e9a 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua @@ -18,11 +18,11 @@ function shell.getShell() if shells[shellName] then return shells[shellName] end - local sh, reason = loadfile(shellName) + local sh, load_reason = loadfile(shellName) if sh then shells[shellName] = sh end - return sh, reason + return sh, load_reason end ------------------------------------------------------------------------------- diff --git a/src/main/resources/assets/opencomputers/loot/openos/usr/misc/greetings.txt b/src/main/resources/assets/opencomputers/loot/openos/usr/misc/greetings.txt index 1ef0905a9..e645e68ea 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/usr/misc/greetings.txt +++ b/src/main/resources/assets/opencomputers/loot/openos/usr/misc/greetings.txt @@ -22,7 +22,7 @@ Many component methods have a short documentation - use `=component.componentNam You can get a list of all attached components using the `components` program. If you encounter out of memory errors, throw more RAM at your computer. Have you tried turning it off and on again? -To disable this greeting, install OpenOS to a writeable medium and remove the `/etc/motd` line from `/etc/profile`. +To disable this greeting, install OpenOS to a writeable medium and remove the `/etc/motd` line from `/etc/profile.lua`. Did you know OpenComputers has a forum? No? Well, it's at https://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! From e57d763f3a3c212f871763e40d2ef13a06382247 Mon Sep 17 00:00:00 2001 From: payonel Date: Sun, 25 Jun 2017 23:31:30 -0700 Subject: [PATCH 22/37] some install fixes --- .../opencomputers/loot/openos/lib/core/install_basics.lua | 7 ++++--- .../opencomputers/loot/openos/lib/core/install_utils.lua | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua index 6673f1a76..a193b7cdf 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua @@ -64,7 +64,7 @@ local targets = {} local devices = {} for dev, path in fs.mounts() do - devices[dev] = path + devices[dev] = devices[dev] and #devices[dev] < #path and devices[dev] or path end devices[fs.get("/dev/") or false] = nil @@ -81,6 +81,7 @@ for dev, path in pairs(devices) do os.exit(1) end elseif specified or + not (source_filter and address:find(source_filter, 1, true) == 1) and -- specified for source not target_filter and address ~= tmpAddress then table.insert(targets, {dev=dev, path=install_path, specified=specified}) @@ -156,8 +157,8 @@ local cp_args = local source_display = options.label or source.dev.getLabel() or source.path local special_target = "" -if #targets > 1 or target_filter then - special_target = " to " .. cp_args[3] +if #targets > 1 or target_filter or source_filter then + special_target = " to " .. cp_args[4] end io.write("Install " .. source_display .. special_target .. "? [Y/n] ") diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua index 557f6e521..0e376abfd 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua @@ -13,7 +13,7 @@ local function select_prompt(devs, prompt) for i = 1, num_devs do local src = devs[i] local dev = src.dev - local selection_label = src.prop.label or dev.getLabel() + local selection_label = (src.prop or {}).label or dev.getLabel() if selection_label then selection_label = string.format("%s (%s...)", selection_label, dev.address:sub(1, 8)) else From 0c595ddda7e99c3aade6bdf1b9bbe96333125dcd Mon Sep 17 00:00:00 2001 From: payonel Date: Mon, 26 Jun 2017 09:24:25 -0700 Subject: [PATCH 23/37] remove needless not nots --- .../resources/assets/opencomputers/loot/openos/lib/tty.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index 7a2d1b1b4..4462eac63 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -25,8 +25,8 @@ local function ctrl_movement(cursor, dir) local start=index+dir+1 for i=start,last,dir do local a,b = unicode.sub(data, i-1, i-1), unicode.sub(data, i, i) - a = a == "" or not not a:find("%s") - b = b == "" or not not b:find("%s") + a = a == "" or a:find("%s") + b = b == "" or b:find("%s") if a and not b then return i - (index + 1) end end return last - index From 0527390466ad659fd8555235da86b7a4d130bc9f Mon Sep 17 00:00:00 2001 From: payonel Date: Mon, 3 Jul 2017 01:23:02 -0700 Subject: [PATCH 24/37] vt100 support * huge terminal performance boost * echo -e option, interpret backslashes * favor io.write instead of print on low level code as print is slightly more memory expensive * use vt100 ansi color coding for PS1 * use tty as std io back end stream * consolidate buffer delay code * add ctrl+backspace and ctrl+w options in io.read * delay load more * term code cleanup * add buffer:size(), returns size of pending data on the stream * memory free 59k * openos 1.6.7 --- .../opencomputers/loot/openos/bin/echo.lua | 6 + .../opencomputers/loot/openos/bin/list.lua | 7 +- .../opencomputers/loot/openos/bin/sh.lua | 21 +- .../opencomputers/loot/openos/boot/03_io.lua | 63 +--- .../opencomputers/loot/openos/etc/profile.lua | 7 +- .../opencomputers/loot/openos/lib/buffer.lua | 23 +- .../loot/openos/lib/core/boot.lua | 2 +- .../full_buffer.lua} | 330 +++++++++++------- .../loot/openos/lib/core/full_filesystem.lua | 2 +- .../loot/openos/lib/core/full_shell.lua | 25 ++ .../loot/openos/lib/core/full_tty.lua | 3 + .../loot/openos/lib/core/lua_shell.lua | 22 +- .../loot/openos/lib/keyboard.lua | 1 + .../opencomputers/loot/openos/lib/shell.lua | 27 +- .../opencomputers/loot/openos/lib/term.lua | 82 ++--- .../loot/openos/lib/tools/buffered_write.lua | 50 --- .../loot/openos/lib/tools/fsmod.lua | 4 +- .../opencomputers/loot/openos/lib/tty.lua | 178 ++++++---- .../opencomputers/loot/openos/lib/vt100.lua | 166 +++++++++ 19 files changed, 596 insertions(+), 423 deletions(-) rename src/main/resources/assets/opencomputers/loot/openos/lib/{tools/buffered_read.lua => core/full_buffer.lua} (57%) create mode 100644 src/main/resources/assets/opencomputers/loot/openos/lib/core/full_shell.lua delete mode 100644 src/main/resources/assets/opencomputers/loot/openos/lib/tools/buffered_write.lua create mode 100644 src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/echo.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/echo.lua index db036c3e6..f18ce4c5b 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/echo.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/echo.lua @@ -2,9 +2,15 @@ local args, options = require("shell").parse(...) if options.help then print([[`echo` writes the provided string(s) to the standard output. -n do not output the trialing newline + -e enable interpretation of backslash escapes --help display this help and exit]]) return end +if options.e then + for index,arg in ipairs(args) do + args[index] = assert(load("return \"" .. arg:gsub('"', [[\"]]) .. "\""))() + end +end io.write(table.concat(args," ")) if not options.n then print() diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/list.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/list.lua index 7d504ce69..1036c745f 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/list.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/list.lua @@ -10,11 +10,12 @@ local arg = args[1] local path = shell.resolve(arg) if ops.help then - print([[Usage: list [path] + io.write([[Usage: list [path] path: optional argument (defaults to ./) Displays a list of files in the given path with no added formatting - Intended for low memory systems]]) + Intended for low memory systems +]]) return 0 end @@ -28,5 +29,5 @@ if why then end for item in fs.list(real) do - print(item) + io.write(item, '\n') end diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua index 337656e0a..9bb706eee 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua @@ -10,11 +10,9 @@ if input[2] then table.insert(args, 1, input[2]) end -local history = {hint = sh.hintHandler} shell.prime() local update_gpu = io.output().tty local interactive = io.input().tty -local foreground if #args == 0 then while true do @@ -22,34 +20,31 @@ if #args == 0 then while not tty.isAvailable() do event.pull("term_available") end - if not foreground and interactive then -- first time run AND interactive + if interactive == true then -- first time run AND interactive + interactive = 0 + tty.setReadHandler({hint = sh.hintHandler}) dofile("/etc/profile.lua") end - foreground = tty.gpu().setForeground(0xFF0000) io.write(sh.expand(os.getenv("PS1") or "$ ")) - tty.gpu().setForeground(foreground) tty.setCursorBlink(true) end - local command = tty.read(history) + local command = io.read() if command then command = text.trim(command) if command == "exit" then return elseif command ~= "" then local result, reason = sh.execute(_ENV, command) - if update_gpu and tty.getCursor() > 1 then - io.write("\n") - end if not result then io.stderr:write((reason and tostring(reason) or "unknown error") .. "\n") end end - elseif command == nil then -- command==false is a soft interrupt, ignore it - if interactive then - io.write("exit\n") -- pipe closed - end + elseif not interactive then return -- eof end + if update_gpu and tty.getCursor() > 1 then + io.write("\n") + end end else -- execute command. diff --git a/src/main/resources/assets/opencomputers/loot/openos/boot/03_io.lua b/src/main/resources/assets/opencomputers/loot/openos/boot/03_io.lua index 83c43245a..1a8fa061b 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/boot/03_io.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/boot/03_io.lua @@ -1,57 +1,14 @@ local buffer = require("buffer") local tty = require("tty") -local stdinStream = {handle="stdin"} -local stdoutStream = {handle="stdout"} -local stderrStream = {handle="stderr"} -local stdinHistory = {} - -local function badFileDescriptor() - return nil, "bad file descriptor" -end - -function stdinStream.close() - return nil, "cannot close standard file" -end -stdoutStream.close = stdinStream.close -stderrStream.close = stdinStream.close - -function stdinStream.read() - return tty.read(stdinHistory) -end - -function stdoutStream:write(str) - tty.drawText(str, self.nowrap) - return self -end - -function stderrStream:write(str) - local gpu = tty.gpu() - local set_depth = gpu and gpu.getDepth() and gpu.getDepth() > 1 - - if set_depth then - set_depth = gpu.setForeground(0xFF0000) +local core_stdin = buffer.new("r", tty) +local core_stdout = buffer.new("w", tty) +local core_stderr = buffer.new("w", setmetatable( +{ + write = function(_, str) + return tty:write("\27[31m"..str.."\27[37m") end - - tty.drawText(str) - - if set_depth then - gpu.setForeground(set_depth) - end - - return self -end - -stdinStream.seek = badFileDescriptor -stdinStream.write = badFileDescriptor -stdoutStream.read = badFileDescriptor -stdoutStream.seek = badFileDescriptor -stderrStream.read = badFileDescriptor -stderrStream.seek = badFileDescriptor - -local core_stdin = buffer.new("r", stdinStream) -local core_stdout = buffer.new("w", stdoutStream) -local core_stderr = buffer.new("w", stderrStream) + }, {__index=tty})) core_stdout:setvbuf("no") core_stderr:setvbuf("no") @@ -59,9 +16,9 @@ core_stdin.tty = true core_stdout.tty = true core_stderr.tty = true -core_stdin.close = stdinStream.close -core_stdout.close = stdinStream.close -core_stderr.close = stdinStream.close +core_stdin.close = tty.close +core_stdout.close = tty.close +core_stderr.close = tty.close local io_mt = getmetatable(io) or {} io_mt.__index = function(_, k) diff --git a/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua index 400f3485e..8f8fecb2d 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua @@ -2,7 +2,10 @@ local shell = require("shell") local tty = require("tty") local fs = require("filesystem") -tty.clear() +if tty.isAvailable() then + tty:write("\27[40m\27[37m") + tty.clear() +end dofile("/etc/motd") shell.setAlias("dir", "ls") @@ -27,7 +30,7 @@ os.setenv("HOME", "/home") os.setenv("IFS", " ") os.setenv("MANPATH", "/usr/man:.") os.setenv("PAGER", "/bin/more") -os.setenv("PS1", "$HOSTNAME$HOSTNAME_SEPARATOR$PWD # ") +os.setenv("PS1", "\27[40m\27[31m$HOSTNAME$HOSTNAME_SEPARATOR$PWD # \27[37m") os.setenv("LS_COLORS", "{FILE=0xFFFFFF,DIR=0x66CCFF,LINK=0xFFAA00,['*.lua']=0x00FF00}") shell.setWorkingDirectory(os.getenv("HOME")) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/buffer.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/buffer.lua index 801c0e26f..4a055030e 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/buffer.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/buffer.lua @@ -9,6 +9,8 @@ local metatable = { function buffer.new(mode, stream) local result = { + closed = false, + tty = false, mode = {}, stream = stream, bufferRead = "", @@ -116,15 +118,10 @@ function buffer:read(...) self:flush() end - local formats = table.pack(...) - if formats.n == 0 then + if select("#", ...) == 0 then return self:readLine(true) end - return require("tools/buffered_read").read(self, readChunk, formats) -end - -function buffer:seek(whence, offset) - return require("tools/buffered_read").seek(self, whence, offset) + return self:formatted_read(readChunk, ...) end function buffer:setvbuf(mode, size) @@ -142,14 +139,6 @@ function buffer:setvbuf(mode, size) return self.bufferMode, self.bufferSize end -function buffer:getTimeout() - return self.readTimeout -end - -function buffer:setTimeout(value) - self.readTimeout = tonumber(value) -end - function buffer:write(...) if self.closed then return nil, "bad file descriptor" @@ -172,7 +161,7 @@ function buffer:write(...) if self.bufferMode == "no" then result, reason = self.stream:write(arg) else - result, reason = require("tools/buffered_write").write(self, arg) + result, reason = self:buffered_write(arg) end if not result then @@ -183,4 +172,6 @@ function buffer:write(...) return self end +require("package").delay(buffer, "/lib/core/full_buffer.lua") + return buffer diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua index ed45c023a..c0be1655b 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/boot.lua @@ -1,7 +1,7 @@ -- called from /init.lua local raw_loadfile = ... -_G._OSVERSION = "OpenOS 1.6.6" +_G._OSVERSION = "OpenOS 1.6.7" local component = component local computer = computer diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tools/buffered_read.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_buffer.lua similarity index 57% rename from src/main/resources/assets/opencomputers/loot/openos/lib/tools/buffered_read.lua rename to src/main/resources/assets/opencomputers/loot/openos/lib/core/full_buffer.lua index c419d9970..360baed59 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tools/buffered_read.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_buffer.lua @@ -1,143 +1,15 @@ +local buffer = require("buffer") local unicode = require("unicode") -local adv_buf = {} -function adv_buf.readNumber(self, readChunk) - local len, sub - if self.mode.b then - len = rawlen - sub = string.sub - else - len = unicode.len - sub = unicode.sub - end - - local buffer = "" - local white_done - - local function peek() - if len(self.bufferRead) == 0 then - local result, reason = readChunk(self) - if not result then - return result, reason - end - end - return sub(self.bufferRead, 1, 1) - end - - local function pop() - local n = sub(self.bufferRead, 1, 1) - self.bufferRead = sub(self.bufferRead, 2) - return n - end - - local function take() - buffer = buffer .. pop() - end - - while true do - local peeked = peek() - if not peeked then - break - end - - if peeked:match("[%s]") then - if white_done then - break - end - pop() - else - white_done = true - if not tonumber(buffer .. peeked .. "0") then - break - end - take() -- add pop to buffer - end - end - - return tonumber(buffer) +function buffer:getTimeout() + return self.readTimeout end -function adv_buf.readBytesOrChars(self, readChunk, n) - n = math.max(n, 0) - local len, sub - if self.mode.b then - len = rawlen - sub = string.sub - else - len = unicode.len - sub = unicode.sub - end - local buffer = "" - repeat - if len(self.bufferRead) == 0 then - local result, reason = readChunk(self) - if not result then - if reason then - return nil, reason - else -- eof - return #buffer > 0 and buffer or nil - end - end - end - local left = n - len(buffer) - buffer = buffer .. sub(self.bufferRead, 1, left) - self.bufferRead = sub(self.bufferRead, left + 1) - until len(buffer) == n - return buffer +function buffer:setTimeout(value) + self.readTimeout = tonumber(value) end -function adv_buf.readAll(self, readChunk) - repeat - local result, reason = readChunk(self) - if not result and reason then - return nil, reason - end - until not result -- eof - local result = self.bufferRead - self.bufferRead = "" - return result -end - -function adv_buf.read(self, readChunk, formats) - self.timeout = require("computer").uptime() + self.readTimeout - local function read(n, format) - if type(format) == "number" then - return adv_buf.readBytesOrChars(self, readChunk, format) - else - local first_char_index = 1 - if type(format) ~= "string" then - error("bad argument #" .. n .. " (invalid option)") - elseif unicode.sub(format, 1, 1) == "*" then - first_char_index = 2 - end - format = unicode.sub(format, first_char_index, first_char_index) - if format == "n" then - return adv_buf.readNumber(self, readChunk) - elseif format == "l" then - return self:readLine(true, self.timeout) - elseif format == "L" then - return self:readLine(false, self.timeout) - elseif format == "a" then - return adv_buf.readAll(self, readChunk) - else - error("bad argument #" .. n .. " (invalid format)") - end - end - end - - local results = {} - for i = 1, formats.n do - local result, reason = read(i, formats[i]) - if result then - results[i] = result - elseif reason then - return nil, reason - end - end - return table.unpack(results, 1, formats.n) -end - -function adv_buf.seek(self, whence, offset) +function buffer:seek(whence, offset) whence = tostring(whence or "cur") assert(whence == "set" or whence == "cur" or whence == "end", "bad argument #1 (set, cur or end expected, got " .. whence .. ")") @@ -159,4 +31,192 @@ function adv_buf.seek(self, whence, offset) end end -return adv_buf +function buffer:buffered_write(arg) + local result, reason + if self.bufferMode == "full" then + if self.bufferSize - #self.bufferWrite < #arg then + result, reason = self:flush() + if not result then + return nil, reason + end + end + if #arg > self.bufferSize then + result, reason = self.stream:write(arg) + else + self.bufferWrite = self.bufferWrite .. arg + result = self + end + else--if self.bufferMode == "line" then + local l + repeat + local idx = arg:find("\n", (l or 0) + 1, true) + if idx then + l = idx + end + until not idx + if l or #arg > self.bufferSize then + result, reason = self:flush() + if not result then + return nil, reason + end + end + if l then + result, reason = self.stream:write(arg:sub(1, l)) + if not result then + return nil, reason + end + arg = arg:sub(l + 1) + end + if #arg > self.bufferSize then + result, reason = self.stream:write(arg) + else + self.bufferWrite = self.bufferWrite .. arg + result = self + end + end + return result, reason +end + +---------------------------------------------------------------------------------------------- + +function buffer:readNumber(readChunk) + local len, sub + if self.mode.b then + len = rawlen + sub = string.sub + else + len = unicode.len + sub = unicode.sub + end + + local number_text = "" + local white_done + + local function peek() + if len(self.bufferRead) == 0 then + local result, reason = readChunk(self) + if not result then + return result, reason + end + end + return sub(self.bufferRead, 1, 1) + end + + local function pop() + local n = sub(self.bufferRead, 1, 1) + self.bufferRead = sub(self.bufferRead, 2) + return n + end + + while true do + local peeked = peek() + if not peeked then + break + end + + if peeked:match("[%s]") then + if white_done then + break + end + pop() + else + white_done = true + if not tonumber(number_text .. peeked .. "0") then + break + end + number_text = number_text .. pop() -- add pop to number_text + end + end + + return tonumber(number_text) +end + +function buffer:readBytesOrChars(readChunk, n) + n = math.max(n, 0) + local len, sub + if self.mode.b then + len = rawlen + sub = string.sub + else + len = unicode.len + sub = unicode.sub + end + local data = "" + repeat + if len(self.bufferRead) == 0 then + local result, reason = readChunk(self) + if not result then + if reason then + return nil, reason + else -- eof + return #data > 0 and data or nil + end + end + end + local left = n - len(data) + data = data .. sub(self.bufferRead, 1, left) + self.bufferRead = sub(self.bufferRead, left + 1) + until len(data) == n + return data +end + +function buffer:readAll(readChunk) + repeat + local result, reason = readChunk(self) + if not result and reason then + return nil, reason + end + until not result -- eof + local result = self.bufferRead + self.bufferRead = "" + return result +end + +function buffer:formatted_read(readChunk, ...) + self.timeout = require("computer").uptime() + self.readTimeout + local function read(n, format) + if type(format) == "number" then + return self:readBytesOrChars(readChunk, format) + else + local first_char_index = 1 + if type(format) ~= "string" then + error("bad argument #" .. n .. " (invalid option)") + elseif unicode.sub(format, 1, 1) == "*" then + first_char_index = 2 + end + format = unicode.sub(format, first_char_index, first_char_index) + if format == "n" then + return self:readNumber(readChunk) + elseif format == "l" then + return self:readLine(true, self.timeout) + elseif format == "L" then + return self:readLine(false, self.timeout) + elseif format == "a" then + return self:readAll(readChunk) + else + error("bad argument #" .. n .. " (invalid format)") + end + end + end + + local results = {} + local formats = table.pack(...) + for i = 1, formats.n do + local result, reason = read(i, formats[i]) + if result then + results[i] = result + elseif reason then + return nil, reason + end + end + return table.unpack(results, 1, formats.n) +end + +function buffer:size() + local len = self.mode.b and rawlen or unicode.len + local size = len(self.bufferRead) + if self.stream.size then + size = size + self.stream:size() + end + return size +end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_filesystem.lua index eee2ef421..99328e9eb 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_filesystem.lua @@ -121,7 +121,7 @@ function filesystem.copy(fromPath, toPath) local data = false local input, reason = filesystem.open(fromPath, "rb") if input then - local output, reason = filesystem.open(toPath, "wb") + local output = filesystem.open(toPath, "wb") if output then repeat data, reason = input:read(1024) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_shell.lua new file mode 100644 index 000000000..2576b07ee --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_shell.lua @@ -0,0 +1,25 @@ +local shell = require("shell") +local process = require("process") + +function shell.aliases() + return pairs(process.info().data.aliases) +end + +function shell.execute(command, env, ...) + local sh, reason = shell.getShell() + if not sh then + return false, reason + end + local proc = process.load(sh, nil, nil, command) + local result = table.pack(process.internal.continue(proc, env, command, ...)) + if result.n == 0 then return true end + return table.unpack(result, 1, result.n) +end + +function shell.getPath() + return os.getenv("PATH") +end + +function shell.setPath(value) + os.setenv("PATH", value) +end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_tty.lua index 67ab6b9e1..9347e8537 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_tty.lua @@ -86,3 +86,6 @@ function tty.on_tab(handler, cursor) end end +function tty:size() + return #(self.window.ansi_response or "") +end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua index 64a2bdcf1..82f4dbe32 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua @@ -1,8 +1,6 @@ local package = require("package") local tty = require("tty") -local gpu = tty.gpu() - local function optrequire(...) local success, module = pcall(require, ...) if success then @@ -32,7 +30,7 @@ env = setmetatable({}, { end end, }) -env._PROMPT = tostring(env._PROMPT or "lua> ") +env._PROMPT = tostring(env._PROMPT or "\27[32mlua> \27[37m") local function findTable(t, path) if type(t) ~= "table" then return nil end @@ -70,8 +68,7 @@ local function findKeys(t, r, prefix, name) end end -local read_handler = {} -function read_handler.hint(line, index) +tty.setReadHandler({hint = function(line, index) line = (line or "") local tail = line:sub(index) line = line:sub(1, index - 1) @@ -88,21 +85,16 @@ function read_handler.hint(line, index) table.insert(hints, key .. tail) end return hints -end +end}) -gpu.setForeground(0xFFFFFF) -io.write(_VERSION .. " Copyright (C) 1994-2017 Lua.org, PUC-Rio\n") -gpu.setForeground(0xFFFF00) -io.write("Enter a statement and hit enter to evaluate it.\n") +io.write("\27[37m".._VERSION .. " Copyright (C) 1994-2017 Lua.org, PUC-Rio\n") +io.write("\27[33mEnter a statement and hit enter to evaluate it.\n") io.write("Prefix an expression with '=' to show its value.\n") -io.write("Press Ctrl+D to exit the interpreter.\n") -gpu.setForeground(0xFFFFFF) +io.write("Press Ctrl+D to exit the interpreter.\n\27[37m") while tty.isAvailable() do - local foreground = gpu.setForeground(0x00FF00) io.write(env._PROMPT) - gpu.setForeground(foreground) - local command = tty.read(read_handler) + local command = io.read() if not command then -- eof return end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua index 70d86893f..a0a68907d 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/keyboard.lua @@ -7,6 +7,7 @@ keyboard.keys = { c = 0x2E, d = 0x20, q = 0x10, + w = 0x11, back = 0x0E, -- backspace delete = 0xD3, down = 0xD0, diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua index 0a9dc2e9a..1ce19db5d 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/shell.lua @@ -55,10 +55,6 @@ function shell.setAlias(alias, value) process.info().data.aliases[alias] = value end -function shell.aliases() - return pairs(process.info().data.aliases) -end - function shell.getWorkingDirectory() -- if no env PWD default to / return os.getenv("PWD") or "/" @@ -77,14 +73,6 @@ function shell.setWorkingDirectory(dir) end end -function shell.getPath() - return os.getenv("PATH") -end - -function shell.setPath(value) - os.setenv("PATH", value) -end - function shell.resolve(path, ext) checkArg(1, path, "string") @@ -102,7 +90,7 @@ function shell.resolve(path, ext) checkArg(2, ext, "string") -- search for name in PATH if no dir was given -- no dir was given if path has no / - local search_in = path:find("/") and dir or shell.getPath() + local search_in = path:find("/") and dir or os.getenv("PATH") for search_path in string.gmatch(search_in, "[^:]+") do -- resolve search_path because they may be relative local search_name = fs.concat(shell.resolve(search_path), name) @@ -119,17 +107,6 @@ function shell.resolve(path, ext) return nil, "file not found" end -function shell.execute(command, env, ...) - local sh, reason = shell.getShell() - if not sh then - return false, reason - end - local proc = process.load(sh, nil, nil, command) - local result = table.pack(process.internal.continue(proc, env, command, ...)) - if result.n == 0 then return true end - return table.unpack(result, 1, result.n) -end - function shell.parse(...) local params = table.pack(...) local args = {} @@ -162,4 +139,6 @@ end ------------------------------------------------------------------------------- +require("package").delay(shell, "/lib/core/full_shell.lua") + return shell diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua index 826d96d03..207c681c0 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua @@ -24,7 +24,7 @@ local function as_window(window, func, ...) data.window = window local ret = table.pack(func(...)) data.window = prev - return table.unpack(ret, ret.n) + return table.unpack(ret, 1, ret.n) end function term.internal.open(...) @@ -55,7 +55,7 @@ function term.internal.open(...) tty.window = nil setmetatable(tty, { - __index = function(tbl, key) + __index = function(_, key) if key == "window" then return term.internal.window() end @@ -68,32 +68,34 @@ function term.internal.open(...) end local function build_horizontal_reader(cursor) - cursor.clear_tail = function(_) - local w,h,dx,dy,x,y = tty.getViewport() - local s1,s2=tty.internal.split(_) + cursor.clear_tail = function(self) + local w,_,dx,dy,x,y = tty.getViewport() + local _,s2=tty.internal.split(self) local wlen = math.min(unicode.wlen(s2),w-x+1) tty.gpu().fill(x+dx,y+dy,wlen,1," ") end - cursor.move = function(_,n) + cursor.move = function(self, n) local win = tty.window - local a = _.index - local b = math.max(0,math.min(unicode.len(_.data),_.index+n)) - _.index = b - a,b = a w then local blank if i == unicode.len(data) then @@ -106,20 +108,20 @@ local function build_horizontal_reader(cursor) local ending = unicode.wtrunc(rev, available+1) data = unicode.reverse(ending) gpu.set(sx,sy,data..blank) - win.x=math.min(w,_.promptx+unicode.wlen(data)) - elseif x < _.promptx then - data = unicode.sub(data,_.index+1) + win.x=math.min(w,self.promptx+unicode.wlen(data)) + elseif x < self.promptx then + data = unicode.sub(data, self.index+1) if unicode.wlen(data) > available then data = unicode.wtrunc(data,available+1) end gpu.set(sx,sy,data) end end - cursor.clear = function(_) + cursor.clear = function(self) local win = tty.window - local gpu,data,px=win.gpu,_.data,_.promptx - local w,h,dx,dy,x,y = tty.getViewport() - _.index,_.data,win.x=0,"",px + local gpu, px = win.gpu, self.promptx + local w,_,dx,dy,_,y = tty.getViewport() + self.index, self.data, win.x = 0, "", px gpu.fill(px+dx,y+dy,w-px+1-dx,1," ") end end @@ -138,14 +140,14 @@ local function inject_filter(handler, filter) __newindex = function(tbl, key, value) if key == "key_down" then local tty_key_down = value - value = function(handler, cursor, char, code) + value = function(_handler, cursor, char, code) if code == keys.enter or code == keys.numpadenter then if not filter(cursor.data) then computer.beep(2000, 0.1) return false -- ignore end end - return tty_key_down(handler, cursor, char, code) + return tty_key_down(_handler, cursor, char, code) end end rawset(tbl, key, value) @@ -170,7 +172,7 @@ local function inject_mask(cursor, dobreak, pwchar) end local cursor_draw = cursor.draw - cursor.draw = function(cursor, text) + cursor.draw = function(self, text) local pre, newline = text:match("(.-)(\n?)$") if dobreak == false then newline = "" @@ -178,19 +180,17 @@ local function inject_mask(cursor, dobreak, pwchar) if pwchar then pre = pwchar(pre) end - return cursor_draw(cursor, pre .. newline) + return cursor_draw(self, pre .. newline) end end -- cannot use term.write = io.write because io.write invokes metatable function term.write(value, wrap) - local stdout = io.output() - local stream = stdout and stdout.stream - local previous_nowrap = stream.nowrap - stream.nowrap = wrap == false - stdout:write(value) - stdout:flush() - stream.nowrap = previous_nowrap + local previous_nowrap = tty.window.nowrap + tty.window.nowrap = wrap == false + io.write(value) + io.stdout:flush() + tty.window.nowrap = previous_nowrap end function term.read(history, dobreak, hint, pwchar, filter) @@ -209,7 +209,7 @@ function term.read(history, dobreak, hint, pwchar, filter) inject_filter(handler, filter) inject_mask(cursor, dobreak, pwchar or history.pwchar) - return tty.read(handler, cursor) + return tty:read(handler, cursor) end function term.getGlobalArea(window) @@ -219,9 +219,9 @@ end function term.clearLine(window) window = window or tty.window - local w,h,dx,dy,x,y = as_window(window, tty.getViewport) - window.gpu.fill(dx+1,dy+math.max(1,math.min(y,h)),w,1," ") - window.x=1 + local w, h, dx, dy, _, y = as_window(window, tty.getViewport) + window.gpu.fill(dx + 1, dy + math.max(1, math.min(y, h)), w, 1, " ") + window.x = 1 end function term.pull(...) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tools/buffered_write.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tools/buffered_write.lua deleted file mode 100644 index fab12e99c..000000000 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tools/buffered_write.lua +++ /dev/null @@ -1,50 +0,0 @@ -local unicode = require("unicode") -local adv_buf = {} - -function adv_buf.write(self, arg) - local result, reason - if self.bufferMode == "full" then - if self.bufferSize - #self.bufferWrite < #arg then - result, reason = self:flush() - if not result then - return nil, reason - end - end - if #arg > self.bufferSize then - result, reason = self.stream:write(arg) - else - self.bufferWrite = self.bufferWrite .. arg - result = self - end - else--if self.bufferMode == "line" then - local l - repeat - local idx = arg:find("\n", (l or 0) + 1, true) - if idx then - l = idx - end - until not idx - if l or #arg > self.bufferSize then - result, reason = self:flush() - if not result then - return nil, reason - end - end - if l then - result, reason = self.stream:write(arg:sub(1, l)) - if not result then - return nil, reason - end - arg = arg:sub(l + 1) - end - if #arg > self.bufferSize then - result, reason = self.stream:write(arg) - else - self.bufferWrite = self.bufferWrite .. arg - result = self - end - end - return result, reason -end - -return adv_buf diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tools/fsmod.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tools/fsmod.lua index c35338069..f2905b898 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tools/fsmod.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tools/fsmod.lua @@ -3,7 +3,7 @@ local filesystem = require("filesystem") local lib = {} function lib.remove(path, findNode) local function removeVirtual() - local node, rest, vnode, vrest = findNode(filesystem.path(path), false, true) + local _, _, vnode, vrest = findNode(filesystem.path(path), false, true) -- vrest represents the remaining path beyond vnode -- vrest is nil if vnode reaches the full path -- thus, if vrest is NOT NIL, then we SHOULD NOT remove children nor links @@ -39,7 +39,7 @@ end function lib.rename(oldPath, newPath, findNode) if filesystem.isLink(oldPath) then - local node, rest, vnode, vrest = findNode(filesystem.path(oldPath)) + local _, _, vnode, _ = findNode(filesystem.path(oldPath)) local target = vnode.links[filesystem.name(oldPath)] local result, reason = filesystem.link(target, newPath) if result then diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index 4462eac63..0789e3f94 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -3,6 +3,7 @@ local event = require("event") local kb = require("keyboard") local component = require("component") local computer = require("computer") +local process = require("process") local keys = kb.keys local tty = {} @@ -18,31 +19,13 @@ tty.window = tty.internal = {} -local function ctrl_movement(cursor, dir) - local index, data = cursor.index, cursor.data - - local last=dir<0 and 0 or unicode.len(data) - local start=index+dir+1 - for i=start,last,dir do - local a,b = unicode.sub(data, i-1, i-1), unicode.sub(data, i, i) - a = a == "" or a:find("%s") - b = b == "" or b:find("%s") - if a and not b then return i - (index + 1) end - end - return last - index -end - -local function read_history(handler, cursor, change) - local ni = handler.index + change - if ni >= 0 and ni <= #handler then - handler[handler.index] = cursor.data - handler.index = ni - cursor:clear() - cursor:update(handler[ni]) - end +function tty.setReadHandler(handler) + checkArg(1, handler, "table") + process.info().data.handler = handler end function tty.key_down_handler(handler, cursor, char, code) + local data = cursor.data local c = false local backup_cache = handler.cache handler.cache = nil @@ -55,21 +38,31 @@ function tty.key_down_handler(handler, cursor, char, code) elseif code == keys.enter or code == keys.numpadenter then cursor:move(math.huge) cursor:draw("\n") - if #cursor.data > 0 then - table.insert(handler, 1, cursor.data) + if #data > 0 then + table.insert(handler, 1, data) handler[(tonumber(os.getenv("HISTSIZE")) or 10)+1]=nil handler[0]=nil end - return nil, cursor.data .. "\n" - elseif code == keys.up then read_history(handler, cursor, 1) - elseif code == keys.down then read_history(handler, cursor, -1) - elseif code == keys.left then cursor:move(ctrl and ctrl_movement(cursor, -1) or -1) - elseif code == keys.right then cursor:move(ctrl and ctrl_movement(cursor, 1) or 1) + return nil, data .. "\n" + elseif code == keys.up or code == keys.down then + local ni = handler.index + (code == keys.up and 1 or -1) + if ni >= 0 and ni <= #handler then + handler[handler.index] = data + handler.index = ni + cursor:clear() + cursor:update(handler[ni]) + end + elseif code == keys.left or code == keys.back or code == keys.w and ctrl then + local value = ctrl and ((unicode.sub(data, 1, cursor.index):find("%s[^%s]+%s*$") or 0) - cursor.index) or -1 + if code == keys.left then + cursor:move(value) + else + c = value + end + elseif code == keys.right then cursor:move(ctrl and ((data:find("%s[^%s]", cursor.index + 1) or math.huge) - cursor.index) or 1) elseif code == keys.home then cursor:move(-math.huge) elseif code == keys["end"] then cursor:move( math.huge) - elseif code == keys.back then c = -1 elseif code == keys.delete then c = 1 - --elseif ctrl and char == "w"then -- TODO: cut word elseif char >= 32 then c = unicode.char(char) else handler.cache = backup_cache -- ignored chars shouldn't clear hint cache end @@ -118,20 +111,22 @@ function tty.pull(cursor, timeout, ...) local blink = tty.getCursorBlink() timeout = timeout or math.huge local blink_timeout = blink and .5 or math.huge - + local gpu = tty.gpu() local width, height, dx, dy, x, y = tty.getViewport() - local out = (x<1 or x>width or y<1 or y>height) - if cursor and out then - cursor:move(0) - cursor:scroll() - out = false + if gpu then + if x < 1 or x > width or y < 1 or y > height then + if cursor then + cursor:move(0) + cursor:scroll() + else + gpu = nil + end + end + x, y = tty.getCursor() + x, y = x + dx, y + dy end - x, y = tty.getCursor() - x, y = x + dx, y + dy - local gpu = not out and tty.gpu() - local bgColor, bgIsPalette local fgColor, fgIsPalette local char_at_cursor @@ -169,7 +164,14 @@ function tty.pull(cursor, timeout, ...) return table.unpack(signal, 1, signal.n) end - signal = table.pack(event.pull(math.min(blink_timeout, timeout), ...)) + -- if vt100 ansi codes have anything buffered for read, return that first + if tty.window.ansi_response then + signal = {"clipboard", tty.keyboard(), tty.window.ansi_response, n=3} + tty.window.ansi_response = nil + else + signal = table.pack(event.pull(math.min(blink_timeout, timeout), ...)) + end + timeout = timeout - blink_timeout done = signal.n > 1 or timeout < blink_timeout end @@ -260,17 +262,21 @@ function tty.internal.build_vertical_reader() self.data = "" end, draw = function(self, text) - self.sy = self.sy + tty.drawText(text) + self.sy = self.sy + tty:write(text) end } end -function tty.read(handler, cursor) - if not io.stdin.tty then return io.read() end - - checkArg(1, handler, "table") +-- read n bytes, n is unused +function tty.read(_, handler, cursor) + checkArg(1, handler, "table", "number") checkArg(2, cursor, "table", "nil") + if type(handler) == "number" then + -- standard read as a stream, asking for n bytes + handler = process.info().data.handler or {} + end + handler.index = 0 cursor = cursor or tty.internal.build_vertical_reader() @@ -286,10 +292,12 @@ function tty.read(handler, cursor) local main_kb = tty.keyboard() local main_sc = tty.screen() if name == "interrupted" then - tty.drawText("^C\n") + tty:write("^C\n") return false elseif address == main_kb or address == main_sc then - local handler_method = handler[name] or tty[name .. "_handler"] + local handler_method = handler[name] or + -- this handler listing hack is to delay load tty + ({key_down=1, touch=1, drag=1, clipboard=1})[name] and tty[name .. "_handler"] if handler_method then -- nil to end (close) -- false to ignore @@ -316,67 +324,97 @@ function tty.setCursor(x, y) window.x, window.y = x, y end -function tty.drawText(value, nowrap) +function tty.write(_, value) local gpu = tty.gpu() if not gpu then return end + local window = tty.window local sy = 0 - local cr_last, beeped + local beeped local uptime = computer.uptime local last_sleep = uptime() - local last_index = 1 - local width, _, dx, dy = tty.getViewport() while true do if uptime() - last_sleep > 1 then os.sleep(0) last_sleep = uptime() end + local ansi_print = "" + if window.ansi_escape then + -- parse the instruction in segment + -- [ (%d+;)+ %d+m + window.ansi_escape = window.ansi_escape .. value + local color_attributes = {tonumber(window.ansi_escape:match("^%[(%d%d)m"))} + if not color_attributes[1] then + color_attributes, ansi_print, value = require("vt100").parse(window) + else + value = window.ansi_escape:sub(5) + end + for _,catt in ipairs(color_attributes) do + local colors = {0x0,0xff0000,0x00ff00,0xffff00,0x0000ff,0x00ffff,0xff00ff,0xffffff} + catt = catt - 29 + local method = "setForeground" + if catt > 10 then + method = "setBackground" + catt = catt - 10 + end + local c = colors[catt] + if c then + gpu[method](c) + end + window.ansi_escape = nil -- might happen multiple times, that's fine + end + end + -- scroll before parsing next line -- the value may only have been a newline sy = sy + tty.scroll() - local x, y = tty.getCursor() - - local si, ei, segment, delim = value:find("([^\t\r\n\a]*)([\t\r\n\a]?)", last_index) - if si > ei then + -- we may have needed to scroll one last time [nowrap adjustments] + if #value == 0 then break end - last_index = ei + 1 + + local x, y = tty.getCursor() + + local _, ei, delim = unicode.sub(value, 1, window.width):find("([\27\t\r\n\a])", #ansi_print + 1) + local segment = ansi_print .. (ei and value:sub(1, ei - 1) or value) if segment ~= "" then - local gpu_x, gpu_y = x + dx, y + dy + local gpu_x, gpu_y = x + window.dx, y + window.dy local tail = "" local wlen_needed = unicode.wlen(segment) - local wlen_remaining = width - x + 1 - if wlen_remaining < wlen_needed then + local wlen_remaining = window.width - x + 1 + if not window.nowrap and wlen_remaining < wlen_needed then segment = unicode.wtrunc(segment, wlen_remaining + 1) wlen_needed = unicode.wlen(segment) -- we can clear the line because we already know remaining < needed tail = (" "):rep(wlen_remaining - wlen_needed) -- we have to reparse the delimeter - last_index = si + #segment + ei = #segment -- fake a newline - if not nowrap then - delim = "\n" - end + delim = "\n" end gpu.set(gpu_x, gpu_y, segment..tail) x = x + wlen_needed end + value = ei and value:sub(ei + 1) or "" + if delim == "\t" then x = ((x-1) - ((x-1) % 8)) + 9 - elseif delim == "\r" or (delim == "\n" and not cr_last) then + elseif delim == "\r" or (delim == "\n" and not window.cr_last) then x = 1 y = y + 1 elseif delim == "\a" and not beeped then computer.beep() beeped = true + elseif delim == "\27" then -- ansi escape + window.ansi_escape = "" end tty.setCursor(x, y) - cr_last = delim == "\r" + window.cr_last = delim == "\r" end return sy end @@ -482,6 +520,12 @@ function tty.scroll(number) return lines end +-- stream methods +local function bfd() return nil, "tty: invalid operation" end +tty.close = bfd +tty.seek = bfd +tty.handle = "tty" + require("package").delay(tty, "/lib/core/full_tty.lua") return tty diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua new file mode 100644 index 000000000..f32488909 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua @@ -0,0 +1,166 @@ +local vt100 = {} + +-- runs patterns on ansi until failure +-- returns valid:boolean, completed_index:nil|number +function vt100.validate(ansi, patterns) + local last_index = 0 + local captures = {} + for _,pattern in ipairs(patterns) do + if last_index >= #ansi then + return true + end + local si, ei, capture = ansi:find("^(" .. pattern .. ")", last_index + 1) + if not si then -- failed to match + return + end + captures[#captures + 1] = capture + last_index = ei + end + return true, last_index, captures +end + +local rules = {} + +-- colors +-- [%d+;%d+;..%d+m +rules[{"%[", "[%d;]*", "m"}] = function(_, _, number_text) + local numbers = {} + number_text:gsub("[^;]*", function(num) + local n = tonumber(num) or 0 + if n == 0 then + numbers[#numbers + 1] = 40 + numbers[#numbers + 1] = 37 + else + numbers[#numbers + 1] = n + end + end) + return numbers +end + +-- [?7[hl] wrap mode +rules[{"%[", "%?", "7", "[hl]"}] = function(window, _, _, _, nowrap) + window.nowrap = nowrap == "l" +end + +-- helper scroll function +local function set_cursor(window, x, y) + window.x = math.min(math.max(x, 1), window.width) + window.y = math.min(math.max(y, 1), window.height) +end + +-- -- These DO NOT SCROLL +-- [(%d+)A move cursor up n lines +-- [(%d+)B move cursor down n lines +-- [(%d+)C move cursor right n lines +-- [(%d+)D move cursor left n lines +rules[{"%[", "%d+", "[ABCD]"}] = function(window, _, n, dir) + local dx, dy = 0, 0 + n = tonumber(n) + if dir == "A" then + dy = -n + elseif dir == "B" then + dy = n + elseif dir == "C" then + dx = n + else -- D + dx = -n + end + set_cursor(window, window.x + dx, window.y + dy) +end + +-- [Line;ColumnH Move cursor to screen location v,h +-- [Line;Columnf ^ same +rules[{"%[", "%d+", ";", "%d+", "[Hf]"}] = function(window, _, y, _, x) + set_cursor(window, tonumber(x), tonumber(y)) +end + +-- [K clear line from cursor right +-- [0K ^ same +-- [1K clear line from cursor left +-- [2K clear entire line +local function clear_line(window, _, n) + n = tonumber(n) or 0 + local x = n == 0 and window.x or 1 + local rep = n == 1 and window.x or window.width + window.gpu.set(x, window.y, (" "):rep(rep)) +end +rules[{"%[", "[012]?", "K"}] = clear_line + +-- [J clear screen from cursor down +-- [0J ^ same +-- [1J clear screen from cursor up +-- [2J clear entire screen +rules[{"%[", "[012]?", "J"}] = function(window, _, n) + clear_line(window, _, n) + n = tonumber(n) or 0 + local y = n == 0 and (window.y + 1) or 1 + local rep = n == 1 and (window.y - 1) or window.height + window.gpu.fill(1, y, window.width, rep, " ") +end + +-- [H move cursor to upper left corner +-- [;H ^ same +-- [f ^ same +-- [;f ^ same +rules[{"%[;?", "[Hf]"}] = function(window) + set_cursor(window, 1, 1) +end + +-- [6n get the cursor position [ EscLine;ColumnR Response: cursor is at v,h ] +rules[{"%[", "6", "n"}] = function(window) + window.ansi_response = string.format("%s%d;%dR", string.char(0x1b), window.y, window.x) +end + +-- D scroll up one line -- moves cursor down +-- E move to next line (acts the same ^, but x=1) +-- M scroll down one line -- moves cursor up +rules[{"[DEM]"}] = function(window, dir) + if dir == "D" then + window.y = window.y + 1 + elseif dir == "E" then + window.y = window.y + 1 + window.x = 1 + else -- M + window.y = window.y - 1 + end +end + +-- 7 save cursor position and attributes +-- 8 restore cursor position and attributes +rules[{"[78]"}] = function(window, restore) + if restore == "8" then + local data = window.saved or {1, 1, {0x0}, {0xffffff}} + window.x = data[1] + window.y = data[2] + window.gpu.setBackground(table.unpack(data[3])) + window.gpu.setForeground(table.unpack(data[4])) + else + window.saved = {window.x, window.y, {window.gpu.getBackground()}, {window.gpu.getForeground()}} + end +end + +function vt100.parse(window) + local ansi = window.ansi_escape + window.ansi_escape = nil + local any_valid + + for rule,action in pairs(rules) do + local ok, completed, captures = vt100.validate(ansi, rule) + if completed then + return action(window, table.unpack(captures)) or {}, "", ansi:sub(completed + 1) + elseif ok then + any_valid = true + end + end + + if not any_valid then + -- malformed + return {}, string.char(0x1b), ansi + end + + -- else, still consuming + window.ansi_escape = ansi + return {}, "", "" +end + +return vt100 From ed05bd11b7c4a53235fa1e715bfe1c46818dde6d Mon Sep 17 00:00:00 2001 From: payonel Date: Tue, 4 Jul 2017 12:01:51 -0700 Subject: [PATCH 25/37] fix cyan/magenta in vt100 color - thanks @LeshaInc --- src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index 0789e3f94..e54531f24 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -352,7 +352,7 @@ function tty.write(_, value) value = window.ansi_escape:sub(5) end for _,catt in ipairs(color_attributes) do - local colors = {0x0,0xff0000,0x00ff00,0xffff00,0x0000ff,0x00ffff,0xff00ff,0xffffff} + local colors = {0x0,0xff0000,0x00ff00,0xffff00,0x0000ff,0xff00ff,0x00ffff,0xffffff} catt = catt - 29 local method = "setForeground" if catt > 10 then From 4b286e24791d97fc6d45351effcb045a3344c49d Mon Sep 17 00:00:00 2001 From: payonel Date: Tue, 4 Jul 2017 15:35:21 -0700 Subject: [PATCH 26/37] fix /bin/install to not suggest source of only rw option --- .../loot/openos/lib/core/install_basics.lua | 26 ++++++++++++++----- .../loot/openos/lib/core/install_utils.lua | 14 ++++++++++ 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua index a193b7cdf..67d218fdd 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_basics.lua @@ -89,12 +89,10 @@ for dev, path in pairs(devices) do end local target = targets[1] -if #targets ~= 1 then - utils = loadfile(utils_path, "bt", _G) - target = utils("select", "targets", options, targets) +-- if there is only 1 target, the source selection cannot include it +if #targets == 1 then + devices[targets[1].dev] = nil end -if not target then return end -devices[target.dev] = nil for dev, path in pairs(devices) do local address = dev.address @@ -127,13 +125,29 @@ for dev, path in pairs(devices) do end end +-- Ask the user to select a source local source = sources[1] if #sources ~= 1 then - utils = utils or loadfile(utils_path, "bt", _G) + utils = loadfile(utils_path, "bt", _G) source = utils("select", "sources", options, sources) end if not source then return end +-- Remove the source from the target options +for index,entry in ipairs(targets) do + if entry.dev == source.dev then + table.remove(targets, index) + target = targets[1] + end +end + +-- Ask the user to select a target +if #targets ~= 1 then + utils = utils or loadfile(utils_path, "bt", _G) + target = utils("select", "targets", options, targets) +end +if not target then return end + options = { from = source.path .. '/', diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua index 0e376abfd..a5704a684 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/install_utils.lua @@ -53,6 +53,20 @@ if cmd == "select" then end os.exit(1) end + local index_of_rw_source + for index,entry in ipairs(devices) do + if not entry.dev.isReadOnly() then + if index_of_rw_source then + -- this means there was another rw source, no special action required + index_of_rw_source = nil + break + end + index_of_rw_source = index + end + end + if index_of_rw_source then + table.remove(devices, index_of_rw_source) + end return select_prompt(devices, "What do you want to install?") elseif arg == "targets" then if #devices == 0 then From e1e2e3c80061d2a5e5abb3ca2cb6adb4e183ed39 Mon Sep 17 00:00:00 2001 From: payonel Date: Wed, 5 Jul 2017 16:37:10 -0700 Subject: [PATCH 27/37] ansi code LS_COLORS, blinking, cyan, and multicolor codes LS_COLORS now respects linux style ansi code list, and /bin/ls has been updated to respect that cursor blinking ws being reset too often that has been fixed cyan ideally should be 0x00ffff, but that colors becomes green when switching bit depths. Thus, openos will use 0x00B6FF for ansi code for cyan fixed some vt100 color list parsing --- .../opencomputers/loot/openos/bin/edit.lua | 2 +- .../opencomputers/loot/openos/bin/sh.lua | 1 - .../opencomputers/loot/openos/etc/profile.lua | 3 +- .../loot/openos/lib/core/devfs/01_hw.lua | 4 +- .../loot/openos/lib/core/full_ls.lua | 70 +++++++++---------- .../opencomputers/loot/openos/lib/tty.lua | 3 +- .../opencomputers/loot/openos/lib/vt100.lua | 5 +- 7 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/edit.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/edit.lua index 3fae5aeef..55860887e 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/edit.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/edit.lua @@ -684,4 +684,4 @@ while running do end term.clear() -term.setCursorBlink(false) +term.setCursorBlink(true) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua index 9bb706eee..0e8f85f6a 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua @@ -26,7 +26,6 @@ if #args == 0 then dofile("/etc/profile.lua") end io.write(sh.expand(os.getenv("PS1") or "$ ")) - tty.setCursorBlink(true) end local command = io.read() if command then diff --git a/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua index 8f8fecb2d..b93c01ed4 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua @@ -5,6 +5,7 @@ local fs = require("filesystem") if tty.isAvailable() then tty:write("\27[40m\27[37m") tty.clear() + tty.setCursorBlink(true) end dofile("/etc/motd") @@ -31,7 +32,7 @@ os.setenv("IFS", " ") os.setenv("MANPATH", "/usr/man:.") os.setenv("PAGER", "/bin/more") os.setenv("PS1", "\27[40m\27[31m$HOSTNAME$HOSTNAME_SEPARATOR$PWD # \27[37m") -os.setenv("LS_COLORS", "{FILE=0xFFFFFF,DIR=0x66CCFF,LINK=0xFFAA00,['*.lua']=0x00FF00}") +os.setenv("LS_COLORS", "di=0;36:fi=0:ln=0;33:*.lua=0;32") shell.setWorkingDirectory(os.getenv("HOME")) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/01_hw.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/01_hw.lua index 50e4a3147..8c8b8e231 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/01_hw.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/devfs/01_hw.lua @@ -40,8 +40,8 @@ end function adapter_api.create_toggle(read, write, switch) return { - read = function() return tostring(read()) end, - write = function(value) + read = read and function() return tostring(read()) end, + write = write and function(value) value = text.trim(tostring(value)) local on = value == "1" or value == "true" local off = value == "0" or value == "false" diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua index 5e7eb6bec..57e178153 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/full_ls.lua @@ -2,6 +2,8 @@ local fs = require("filesystem") local shell = require("shell") local tty = require("tty") local unicode = require("unicode") +local tx = require("transforms") +local text = require("text") local dirsArg, ops = shell.parse(...) @@ -32,7 +34,6 @@ if #dirsArg == 0 then end local ec = 0 -local gpu = tty.gpu() local fOut = tty.isAvailable() and io.output().tty local function perr(msg) io.stderr:write(msg,"\n") ec = 2 end local function stat(names, index) @@ -56,42 +57,30 @@ local function stat(names, index) return info end local function toArray(i) local r={} for n in i do r[#r+1]=n end return r end -local restore_color = function() end local set_color = function() end -local prev_color -local function colorize() return prev_color end +local function colorize() return end if fOut and not ops["no-color"] then - local LSC = os.getenv("LS_COLORS") - if type(LSC) == "string" then - LSC = require("serialization").unserialize(LSC) + local LSC = tx.foreach(text.split(os.getenv("LS_COLORS") or "", {":"}, true), function(e) + local parts = text.split(e, {"="}, true) + return parts[2], parts[1] + end) + colorize = function(info) + return + info.isLink and LSC.ln or + info.isDir and LSC.di or + LSC['*'..info.ext] or + LSC.fi end - if not LSC then - perr("ls: unparsable value for LS_COLORS environment variable") - else - prev_color = gpu.getForeground() - restore_color = function() gpu.setForeground(prev_color) end - colorize = function(info) - return - info.isLink and LSC.LINK or - info.isDir and LSC.DIR or - LSC['*'..info.ext] or - LSC.FILE or - prev_color - end - set_color=function(c) - if gpu.getForeground() ~= c then - io.stdout:flush() - gpu.setForeground(c) - end - end + set_color=function(c) + io.write(string.char(0x1b), "[", c or "", "m") end end local msft={reports=0,proxies={}} function msft.report(files, dirs, used, proxy) local free = proxy.spaceTotal() - proxy.spaceUsed() - restore_color() - local pattern = "%5i File(s) %11i bytes\n%5i Dir(s) %11s bytes free\n" - io.write(string.format(pattern, files, used, dirs, tostring(free))) + set_color() + local pattern = "%5i File(s) %s bytes\n%5i Dir(s) %11s bytes free\n" + io.write(string.format(pattern, files, tostring(used), dirs, tostring(free))) end function msft.tail(names) local fsproxy = fs.get(names.path) @@ -123,7 +112,7 @@ function msft.final() for proxy,report in pairs(msft.proxies) do table.insert(groups, {proxy=proxy,report=report}) end - restore_color() + set_color() print("Total Files Listed:") for _,pair in ipairs(groups) do local proxy, report = pair.proxy, pair.report @@ -263,7 +252,7 @@ local function display(names) local format = "%s-r%s %+"..tostring(max_size_width).."s %"..tostring(max_date_width).."s" local meta = string.format(format, file_type, write_mode, size, modDate) local item = info.name..link_target - return {{color = prev_color, name = meta}, {color = colorize(info), name = item}} + return {{name = meta}, {color = colorize(info), name = item}} end elseif ops["1"] or not fOut then lines.n = #names @@ -332,7 +321,7 @@ local header = function() end if #dirsArg > 1 or ops.R then header = function(path) if not first_display then print() end - restore_color() + set_color() io.write(path,":\n") end end @@ -366,11 +355,20 @@ for _,dir in ipairs(dirsArg) do table.insert(file_set, dir) end end + io.output():setvbuf("line") -if #file_set > 0 then display(sort(file_set)) end -displayDirList(dir_set) -msft.final() + +local ok, msg = pcall(function() + if #file_set > 0 then display(sort(file_set)) end + displayDirList(dir_set) + msft.final() +end) + io.output():flush() io.output():setvbuf("no") -restore_color() +set_color() + +assert(ok, msg) + return ec + diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index e54531f24..5b9708cac 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -352,7 +352,8 @@ function tty.write(_, value) value = window.ansi_escape:sub(5) end for _,catt in ipairs(color_attributes) do - local colors = {0x0,0xff0000,0x00ff00,0xffff00,0x0000ff,0xff00ff,0x00ffff,0xffffff} + -- B6 is closer to cyan in 4 bit color + local colors = {0x0,0xff0000,0x00ff00,0xffff00,0x0000ff,0xff00ff,0x00B6ff,0xffffff} catt = catt - 29 local method = "setForeground" if catt > 10 then diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua index f32488909..396710484 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua @@ -25,7 +25,10 @@ local rules = {} -- [%d+;%d+;..%d+m rules[{"%[", "[%d;]*", "m"}] = function(_, _, number_text) local numbers = {} - number_text:gsub("[^;]*", function(num) + -- add a ; at the end to recompute trailing ; as resets + -- e.g. \27[41;m is actually 41 followed by a reset + (number_text..";"):gsub("([^;]*);?", function(num) + -- if not n this could simply be a ; separator local n = tonumber(num) or 0 if n == 0 then numbers[#numbers + 1] = 40 From fabbb630d4d5da74ad3ba2253dad33b3c883cfbd Mon Sep 17 00:00:00 2001 From: gamax92 Date: Fri, 7 Jul 2017 19:08:10 -0600 Subject: [PATCH 28/37] Make wtrunc count missing glyphs as 1 otherwise this function has odd behavior when compared with wlen --- src/main/scala/li/cil/oc/server/machine/luac/UnicodeAPI.scala | 2 +- src/main/scala/li/cil/oc/server/machine/luaj/UnicodeAPI.scala | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/scala/li/cil/oc/server/machine/luac/UnicodeAPI.scala b/src/main/scala/li/cil/oc/server/machine/luac/UnicodeAPI.scala index 0be3f1ead..c327815c4 100644 --- a/src/main/scala/li/cil/oc/server/machine/luac/UnicodeAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luac/UnicodeAPI.scala @@ -81,7 +81,7 @@ class UnicodeAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) { var width = 0 var end = 0 while (width < count) { - width += FontUtils.wcwidth(value(end)) + width += math.max(1, FontUtils.wcwidth(value(end))) end += 1 } if (end > 1) lua.pushString(value.substring(0, end - 1)) diff --git a/src/main/scala/li/cil/oc/server/machine/luaj/UnicodeAPI.scala b/src/main/scala/li/cil/oc/server/machine/luaj/UnicodeAPI.scala index b791210e1..2f008bddb 100644 --- a/src/main/scala/li/cil/oc/server/machine/luaj/UnicodeAPI.scala +++ b/src/main/scala/li/cil/oc/server/machine/luaj/UnicodeAPI.scala @@ -53,7 +53,7 @@ class UnicodeAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) { var width = 0 var end = 0 while (width < count) { - width += FontUtils.wcwidth(value(end)) + width += math.max(1, FontUtils.wcwidth(value(end))) end += 1 } if (end > 1) LuaValue.valueOf(value.substring(0, end - 1)) From d753d83bb421862a3196481f04b1a050c72dc6f0 Mon Sep 17 00:00:00 2001 From: payonel Date: Fri, 7 Jul 2017 17:28:47 -0700 Subject: [PATCH 29/37] reverting read handler weirdness, it didn't work right Users shouldn't use tty read nor write directly, they should always use io or term. But...it is messy to try to hide these methods as private methods in the io library, so I'll just have to check the io tty-ness just in case --- .../opencomputers/loot/openos/bin/sh.lua | 10 ++++----- .../opencomputers/loot/openos/etc/profile.lua | 6 ++++-- .../loot/openos/lib/core/lua_shell.lua | 6 +++--- .../loot/openos/lib/filesystem.lua | 1 - .../opencomputers/loot/openos/lib/term.lua | 3 --- .../opencomputers/loot/openos/lib/tty.lua | 21 +++++++++---------- 6 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua index 0e8f85f6a..f5fde9c62 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/sh.lua @@ -12,7 +12,8 @@ end shell.prime() local update_gpu = io.output().tty -local interactive = io.input().tty +local needs_profile = io.input().tty +local input_handler = {hint = sh.hintHandler} if #args == 0 then while true do @@ -20,14 +21,13 @@ if #args == 0 then while not tty.isAvailable() do event.pull("term_available") end - if interactive == true then -- first time run AND interactive - interactive = 0 - tty.setReadHandler({hint = sh.hintHandler}) + if needs_profile then -- first time run AND interactive + needs_profile = nil dofile("/etc/profile.lua") end io.write(sh.expand(os.getenv("PS1") or "$ ")) end - local command = io.read() + local command = tty:read(input_handler) if command then command = text.trim(command) if command == "exit" then diff --git a/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua index b93c01ed4..9fc3df6d1 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/etc/profile.lua @@ -3,8 +3,10 @@ local tty = require("tty") local fs = require("filesystem") if tty.isAvailable() then - tty:write("\27[40m\27[37m") - tty.clear() + if io.stdout.tty then + io.write("\27[40m\27[37m") + tty.clear() + end tty.setCursorBlink(true) end dofile("/etc/motd") diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua index 82f4dbe32..ad7997a63 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/core/lua_shell.lua @@ -68,7 +68,7 @@ local function findKeys(t, r, prefix, name) end end -tty.setReadHandler({hint = function(line, index) +local read_handler = {hint = function(line, index) line = (line or "") local tail = line:sub(index) line = line:sub(1, index - 1) @@ -85,7 +85,7 @@ tty.setReadHandler({hint = function(line, index) table.insert(hints, key .. tail) end return hints -end}) +end} io.write("\27[37m".._VERSION .. " Copyright (C) 1994-2017 Lua.org, PUC-Rio\n") io.write("\27[33mEnter a statement and hit enter to evaluate it.\n") @@ -94,7 +94,7 @@ io.write("Press Ctrl+D to exit the interpreter.\n\27[37m") while tty.isAvailable() do io.write(env._PROMPT) - local command = io.read() + local command = tty:read(read_handler) if not command then -- eof return end diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua index 2171f4279..2d6d7740d 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/filesystem.lua @@ -24,7 +24,6 @@ end local function saveConfig() local root = filesystem.get("/") if root and not root.isReadOnly() then - filesystem.makeDirectory("/etc") local f = filesystem.open("/etc/filesystem.cfg", "w") if f then f:write("autorun="..tostring(isAutorunEnabled)) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua index 207c681c0..3ce1df9ff 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/term.lua @@ -194,9 +194,6 @@ function term.write(value, wrap) end function term.read(history, dobreak, hint, pwchar, filter) - if not io.stdin.tty then - return io.read("*L") - end history = history or {} local handler = history handler.hint = handler.hint or hint diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua index 5b9708cac..b860dbb77 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/tty.lua @@ -3,7 +3,6 @@ local event = require("event") local kb = require("keyboard") local component = require("component") local computer = require("computer") -local process = require("process") local keys = kb.keys local tty = {} @@ -19,11 +18,6 @@ tty.window = tty.internal = {} -function tty.setReadHandler(handler) - checkArg(1, handler, "table") - process.info().data.handler = handler -end - function tty.key_down_handler(handler, cursor, char, code) local data = cursor.data local c = false @@ -268,15 +262,17 @@ function tty.internal.build_vertical_reader() end -- read n bytes, n is unused -function tty.read(_, handler, cursor) +function tty.read(self, handler, cursor) checkArg(1, handler, "table", "number") checkArg(2, cursor, "table", "nil") - if type(handler) == "number" then - -- standard read as a stream, asking for n bytes - handler = process.info().data.handler or {} + if not io.stdin.tty or io.stdin.stream ~= self then + return io.stdin:readLine(false) end + if type(handler) ~= "table" then + handler = {} + end handler.index = 0 cursor = cursor or tty.internal.build_vertical_reader() @@ -324,7 +320,10 @@ function tty.setCursor(x, y) window.x, window.y = x, y end -function tty.write(_, value) +function tty.write(self, value) + if not io.stdout.tty or io.stdout.stream ~= self then + return io.write(value) + end local gpu = tty.gpu() if not gpu then return From 3d6e77f87985507df5eef14215577e0ce1fa1769 Mon Sep 17 00:00:00 2001 From: payonel Date: Sat, 8 Jul 2017 00:47:19 -0700 Subject: [PATCH 30/37] fix gsub issue: lua 5.3 changed from lua 5.2 --- .../opencomputers/loot/openos/lib/vt100.lua | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua b/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua index 396710484..4e6111b50 100644 --- a/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua +++ b/src/main/resources/assets/opencomputers/loot/openos/lib/vt100.lua @@ -1,3 +1,4 @@ +local text = require("text") local vt100 = {} -- runs patterns on ansi until failure @@ -25,18 +26,26 @@ local rules = {} -- [%d+;%d+;..%d+m rules[{"%[", "[%d;]*", "m"}] = function(_, _, number_text) local numbers = {} - -- add a ; at the end to recompute trailing ; as resets + -- prefix and suffix ; act as reset -- e.g. \27[41;m is actually 41 followed by a reset - (number_text..";"):gsub("([^;]*);?", function(num) - -- if not n this could simply be a ; separator - local n = tonumber(num) or 0 - if n == 0 then + number_text = ";" .. number_text:gsub("^;$","") .. ";" + local parts = text.split(number_text, {";"}) + local last_was_break + for _,part in ipairs(parts) do + local num = tonumber(part) + if not num then + num = last_was_break and 0 + last_was_break = true + else + last_was_break = false + end + if num == 0 then numbers[#numbers + 1] = 40 numbers[#numbers + 1] = 37 - else - numbers[#numbers + 1] = n + elseif num then + numbers[#numbers + 1] = num end - end) + end return numbers end From 9fbef39829a690ac641091ccb38e1095972bf4b2 Mon Sep 17 00:00:00 2001 From: cyber01 Date: Thu, 13 Jul 2017 11:31:30 +0300 Subject: [PATCH 31/37] Upgrading to the current state (compared to the original OS), translated the missing parts. Merged with @MoonlightOwl changes --- .../opencomputers/doc/ru_RU/block/adapter.md | 1 + .../assets/opencomputers/doc/ru_RU/block/index.md | 2 +- .../assets/opencomputers/doc/ru_RU/block/rack.md | 2 +- .../assets/opencomputers/doc/ru_RU/index.md | 3 ++- .../opencomputers/doc/ru_RU/item/debugCard.md | 2 ++ .../assets/opencomputers/doc/ru_RU/item/index.md | 1 + .../doc/ru_RU/item/inventoryControllerUpgrade.md | 2 ++ .../assets/opencomputers/doc/ru_RU/item/mfu.md | 7 +++++++ .../opencomputers/doc/ru_RU/item/redstoneCard1.md | 2 +- .../doc/ru_RU/item/tankControllerUpgrade.md | 2 ++ .../resources/assets/opencomputers/lang/ru_RU.lang | 14 +++++++++++++- 11 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/assets/opencomputers/doc/ru_RU/item/mfu.md diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/adapter.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/adapter.md index b072ea457..53bc83c08 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/adapter.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/adapter.md @@ -5,3 +5,4 @@ Адаптеры позволяют [компьютерам](../general/computer.md) взаимодействовать с блоками Minecraft и блоками из других модов. Поддерживаемые блоки, прилегающие к адаптеру, будут отображаться как компоненты [компьютера](../general/computer.md), подключенного к адаптеру. В дополнение к этому, адаптеры добавляют слот для нескольких улучшений. Например, [контроллер инвентаря](../item/inventoryControllerUpgrade.md) позволяет компьютеру получать подробную информацию о предметах в инвентаре, для блока подключенного через адаптер, также это улучшение может быть установлено и в другие устройства (например [роботов](robot.md) или [дронов](../item/drone.md)), также [контроллер бака](../item/tankControllerUpgrade.md) предоставляет аналогичный функционал, только для жидкостей. +Тажке, вы можете вставить связанный [МФУ](../item/mfu.md) для взаимодействия с блоками в нескольких местах. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md index c8087e8f3..d993f70a0 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/index.md @@ -8,7 +8,7 @@ * [Системный блок](case1.md) * [Микроконтроллер](microcontroller.md) * [Робот](robot.md) -* [Серверная стойка](serverRack.md) +* [Серверная стойка](rack.md) ## Компоненты diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/block/rack.md b/src/main/resources/assets/opencomputers/doc/ru_RU/block/rack.md index bd8ffe939..59083fb52 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/block/rack.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/block/rack.md @@ -1,6 +1,6 @@ # Стойка -![Бесплатное жилье.](oredict:oc:serverRack) +![Бесплатное жилье.](oredict:oc:rack) Стойка может содержать до 4 подключемых устройств, таких как: [серверы](../item/server1.md), [терминальные серверы](../item/terminalServer.md) и [подключаемые дисководы](../item/diskDriveMountable.md). Соединение между подключаемыми устройствами в стойку может быть настроено с помощью интерфейса стойки. В частности, если [серверы](../item/server1.md) содержат компоненты, которые поддерживают работу с сетью, такие как [сетевые карты](../item/lanCard.md), то будут установлены только сетевые соединения. Эти соединения будут служить только для передачи сетевых сообщений, компоненты не будут видны через них. Такие подключения отличаются более тонкой линией от "главных", которые имеют доступ к компонентам. Каждое внутреннее соединение должно быть между подключаемым устройством/компонентом и шиной, соединенной со стороной стойки. Для соеднинения нескольких подключаемых устройств вместе, подключите их на одну общую шину. diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/index.md index f60431a61..749024ce0 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/index.md @@ -7,6 +7,7 @@ OpenComputers это мод, который добавляет модульны ## Содержание ### Устройства + - [Компьютеры](general/computer.md) - [Серверы](item/server1.md) - [Микроконтроллеры](block/microcontroller.md) @@ -32,7 +33,7 @@ OpenComputers это мод, который добавляет модульны Устройства OpenComputers совместимы с множеством других модов, что позволяет производить манипуляции над блоками и сущностями (через [адаптер](block/adapter.md) или добавляет специфические улучшения для [роботов](block/robot.md) и [дронов](item/drone.md)). Энергия может быть также получена из других модов, например, Redstone Flux, IndustrialCraft2 EU, Mekanism Joules, Applied Energistics 2 и Factorization Charge. -Устройства в OpenComputers имеют дополнительные функции, а также ограничения. [Компьютеры](general/computer.md) основа всего и они могут обслуживать различное количество компонентов, в зависимости от уровня используемого процессора. [Компьютеры](general/computer.md), также имеют доступ к компонентам со всех шести сторон. [Серверы](item/server1.md) могут подключаться к большему количеству компонентов (внешних или внутренних) чем [компьютеры](general/computer.md), за счет использования [компонентных шин](item/componentBus1.md); Однако, в [серверных стойках](block/serverRack.md), каждый [сервер](item/server1.md) имеет доступ к компонентам только с одной стороны [серверной стойки](block/serverRack.md), как это настроено в интерфейсе [серверной стойки](block/serverRack.md). [Микроконтроллеры](block/microcontroller.md) еще сильнее ограничены (по сравнению с [компьютерами](general/computer.md)), они не имеют [жесткого диска](item/hdd1.md) и [дисковода](block/diskDrive.md), это означает, что [OpenOS](general/openOS.md) не может быть установлена на [микроконтроллер](block/microcontroller.md). [Микроконтроллеры](block/microcontroller.md) имеют слот для [EEPROM](item/eeprom.md) и могут быть запрограммированы для специфических задач. +Устройства в OpenComputers имеют дополнительные функции, а также ограничения. [Компьютеры](general/computer.md) основа всего и они могут обслуживать различное количество компонентов, в зависимости от уровня используемого процессора. [Компьютеры](general/computer.md), также имеют доступ к компонентам со всех шести сторон. [Серверы](item/server1.md) могут подключаться к большему количеству компонентов (внешних или внутренних) чем [компьютеры](general/computer.md), за счет использования [компонентных шин](item/componentBus1.md); Однако, в [серверных стойках](block/rack.md), каждый [сервер](item/server1.md) имеет доступ к компонентам только с одной стороны [серверной стойки](block/rack.md), как это настроено в интерфейсе [серверной стойки](block/rack.md). [Микроконтроллеры](block/microcontroller.md) еще сильнее ограничены (по сравнению с [компьютерами](general/computer.md)), они не имеют [жесткого диска](item/hdd1.md) и [дисковода](block/diskDrive.md), это означает, что [OpenOS](general/openOS.md) не может быть установлена на [микроконтроллер](block/microcontroller.md). [Микроконтроллеры](block/microcontroller.md) имеют слот для [EEPROM](item/eeprom.md) и могут быть запрограммированы для специфических задач. [Роботы](block/robot.md) это передвижные [компьютеры](general/computer.md) и они могут взаимодействовать с игровым миром (но не могут взаимодействовать с внешними блоками OpenComputers). В отличие от [компьютеров](general/computer.md), после создания, компоненты внутри [робота](block/robot.md) не могут быть извлечены. Для обхода этого ограничения, [роботы](block/robot.md) могут быть созданы с [улучшением компонентов](item/upgradeContainer1.md) или [улучшением карт](item/cardContainer1.md), что позволяет в любой момент изменить конфигурацию карта и улучшений, если требуется. Операционная система [OpenOS](general/openOS.md) может быть установлена в [роботов](block/robot.md) добавлением [дисковода](block/diskDrive.md) в один из слотов при сборке, после чего вы сможете вставить [дискету](item/floppy.md) или во время сборки вставьте [жесткий диск](item/hdd1.md) с установленной на него [OpenOS](general/openOS.md). Для полного изменения конфигурации [робота](block/robot.md) вам потребуется [разборщик](block/disassembler.md). [Дроны](item/drone.md) это урезанная версия [роботов](block/robot.md). Они двигаются по-другому, имеют несколько слотов для компонентов и не имеют операционной системы (также как и [микроконтроллеры](block/microcontroller.md), [дроны](item/drone.md) могут быть сконфигурированы с помощью [EEPROM](item/eeprom.md), для выполнения специфических задач). В основном, [роботы](block/robot.md) и [дроны](item/drone.md) имеют одни и те же компоненты и улучшения; Однако, эффективность улучшений различна, например у [дронов](item/drone.md) [улучшение инвентаря](item/inventoryUpgrade.md) добавит только 4 слота за каждое улучшение и позволяет иметь всего 8 слотов, в то время, как [роботы](block/robot.md) могут иметь больше [улучшений инвентаря](item/inventoryUpgrade.md) (в сумме 4), а также большее количество слотов с каждым улучшение (по 16 слотов на улучшение). diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/debugCard.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/debugCard.md index 270d4a1a1..9674aae34 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/debugCard.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/debugCard.md @@ -5,3 +5,5 @@ Отладочная карта, это креативный предмет, предназначенный изначально для отладки некоторых вещей, за счет автоматизации процесса. С тех пор она обрела большую функциональность, что делает ее идеальным инструментом для создания карт. Обратите внимание, что вы можете привязать/отвязать карту, нажав кнопку `Красться`, держа в руках карту, это означает, что `команды` будут выполнены на основе вашего уровня доступа, а не умолчаний OpenComputers. + +Отладочная карта может принимать сообщения как и [связанная карта](linkedCard.md), через событие `debug_message`. Вы можете отправить сообщение используя другую отладочную карту через `sendDebugMessage` или Minecraft команду `/oc_sendDebugMessage` (или `/oc_sdbg`). \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md index 1b7ccc1e4..59dcf3e68 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/index.md @@ -43,6 +43,7 @@ * [Контроллер инвентаря](inventoryControllerUpgrade.md) * [Инвентарь](inventoryUpgrade.md) * [Поводок](leashUpgrade.md) +* [МФУ](mfu.md) * [Навигация](navigationUpgrade.md) * [Поршень](pistonUpgrade.md) * [Табличка](signUpgrade.md) diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/inventoryControllerUpgrade.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/inventoryControllerUpgrade.md index be1396e4a..5762aff7d 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/inventoryControllerUpgrade.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/inventoryControllerUpgrade.md @@ -5,3 +5,5 @@ Контроллер инвентаря добавляет еще больше действий с инвентарем для [роботов](../block/robot.md) и [дронов](drone.md). Это позволяет устройству явно указывать слоты для внешних инвентарей. Также позволяет получать подробную информацию о стаках предметов. Напоследок позволяет [роботам](../block/robot.md) менять инструменты в зависимости от блока, без посторонней помощи. Данное улучшение может быть вставлено в [адаптеры](../block/adapter.md), что добавит дополнительные методы работы с инвентарем для [адаптера](../block/adapter.md) также как для [робота](../block/robot.md). Это не позволяет [адаптеру](../block/adapter.md) перемещать предметы в/из инвентари. Данная функция доступна только для [роботов](../block/robot.md) и [дронов](drone.md). + +Смотрите также: [Транспозер](../block/transposer.md) \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/mfu.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/mfu.md new file mode 100644 index 000000000..4885535d7 --- /dev/null +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/mfu.md @@ -0,0 +1,7 @@ +# МФУ + +![Вы никогда не узнаете истинного смысла этой аббревиатуры.](oredict:oc:mfu) + +Это улучшение работает как удаленный [адаптер](../block/adapter.md). Присев кликните на любую сторону любого блока, чтобы привязать МФУ к определенной позиции. Потом, поместите его в адаптер рядом (расстояние очень ограничено) и он будет действовать так, будто адаптер был расположен рядом со стороной блока с которой вы его связали! + +Во время своей работы удаленный адаптер потребляет энергию. \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/redstoneCard1.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/redstoneCard1.md index 0537ed380..9a4f66e5f 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/redstoneCard1.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/redstoneCard1.md @@ -6,4 +6,4 @@ Если у вас установлен любой из модов, которые добавляют многожильные провода, такие как RedLogic, Project Red или MineFactory Reloaded и иные, вы в полной мере можете взаимодействовать и с ними. -Сторона сигнала аналогична стороне [системного блока](../block/case1.md) / [робота](../block/robot.md) / [серверной стойки](../block/serverRack.md). Это означает, что если вы смотрите на компьютер спереди, `sides.right` будет слева от вас. +Сторона сигнала аналогична стороне [системного блока](../block/case1.md) / [робота](../block/robot.md) / [серверной стойки](../block/rack.md). Это означает, что если вы смотрите на компьютер спереди, `sides.right` будет слева от вас. diff --git a/src/main/resources/assets/opencomputers/doc/ru_RU/item/tankControllerUpgrade.md b/src/main/resources/assets/opencomputers/doc/ru_RU/item/tankControllerUpgrade.md index 883499f50..21a4bd1de 100644 --- a/src/main/resources/assets/opencomputers/doc/ru_RU/item/tankControllerUpgrade.md +++ b/src/main/resources/assets/opencomputers/doc/ru_RU/item/tankControllerUpgrade.md @@ -5,3 +5,5 @@ Контроллер бака, аналогичен [контроллеру инвентаря](inventoryControllerUpgrade.md), только для жидкостей. Позволяет устройствам получать подробную информацию о баках и их содержимом. Это улучшение может быть установлено в [адаптеры](../block/adapter.md), позволяя [компьютерам](../general/computer.md), подключенным к [адаптеру](../block/adapter.md) запрашивать информацию о баках, прилегающих к [адаптеру](../block/adapter.md). + +Смотрите также: [Транспозер](../block/transposer.md) \ No newline at end of file diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 655ca7fb1..39ff9f6de 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -30,6 +30,7 @@ tile.oc.print.name=3D модель tile.oc.printer.name=3D принтер tile.oc.raid.name=RAID tile.oc.redstone.name=Красный камень (ввод/вывод) +tile.oc.relay.name=Ретранслятор tile.oc.robot.name=Робот tile.oc.robotAfterimage.name=Робот tile.oc.screen1.name=Монитор (1-ый уровень) @@ -61,6 +62,9 @@ item.oc.CPU0.name=Центральный процессор (ЦП) (1-ый ур item.oc.CPU1.name=Центральный процессор (ЦП) (2-ой уровень) item.oc.CPU2.name=Центральный процессор (ЦП) (3-ий уровень) item.oc.CuttingWire.name=Проволока +item.oc.DataCard0.name=Карта данных (1-ый уровень) +item.oc.DataCard1.name=Карта данных (2-ой уровень) +item.oc.DataCard2.name=Карта данных (3-ий уровень) item.oc.DebugCard.name=Отладочная карта item.oc.Debugger.name=Сетевой отладчик item.oc.DiamondChip.name=Алмазный обломок @@ -115,6 +119,7 @@ item.oc.TabletCase0.name=Корпус планшета (1-ый уровень) item.oc.TabletCase1.name=Корпус планшета (2-ой уровень) item.oc.TabletCase3.name=Корпус планшета (Креатив) item.oc.Terminal.name=Беспроводной терминал +item.oc.TerminalServer.name=Терминальный сервер item.oc.TexturePicker.name=Выбор текстур item.oc.Transistor.name=Транзистор item.oc.UpgradeAngel.name="Ангельское" улучшение @@ -139,6 +144,7 @@ item.oc.UpgradeHover1.name=Улучшение "Парение" (2-ый уров item.oc.UpgradeInventory.name=Улучшение "Инвентарь" item.oc.UpgradeInventoryController.name=Улучшение "Контроллер инвентаря" item.oc.UpgradeLeash.name=Улучшение "Поводок" +item.oc.UpgradeMF.name=МФУ item.oc.UpgradeNavigation.name=Улучшение "Навигация" item.oc.UpgradePiston.name=Улучшение "Поршень" item.oc.UpgradeSign.name=Улучшение "Табличка: ввод/вывод" @@ -210,11 +216,13 @@ oc:gui.Raid.Warning=§4Добавление диска - очистит его.[ oc:gui.Robot.Power=Энергия oc:gui.Robot.TurnOff=Выключить oc:gui.Robot.TurnOn=Включить -oc:gui.ServerRack.None=Нет oc:gui.ServerRack.Back=Сзади oc:gui.ServerRack.Bottom=Снизу oc:gui.ServerRack.Left=Слева +oc:gui.ServerRack.None=Нет oc:gui.ServerRack.Right=Справа +oc:gui.Rack.Enabled=Включено +oc:gui.Rack.Disabled=Выключено oc:gui.ServerRack.Top=Сверху oc:gui.ServerRack.SwitchExternal=Внешний oc:gui.ServerRack.SwitchInternal=Внутренний @@ -341,6 +349,7 @@ oc:tooltip.Switch=Позволяет соединять различные се oc:tooltip.Tablet=Планшет, полностью готов к работе с Lua. Может быть отключен нажатием правой кнопки мыши + Shift. oc:tooltip.TabletCase=Простой корпус для планшета. Поместите в сборщик, добавьте компонентов и соберите себе компьютер. oc:tooltip.Terminal=Позволяет дистанционно управлять сервером, пока вы находитесь в радиусе его действия. Действует как портативный дисплей с клавиатурой.[nl] Shift+ПКМ по серверу в стойке для привязки к нему терминала. +oc:tooltip.TerminalServer=Бекенд, к которому можно подключить беспроводной терминал. Имеет виртуальный экран и клавиатуру. oc:tooltip.TexturePicker=Простой инструмент, позволяющий узнать название текстуры блока, которое можно использовать в 3D печати. oc:tooltip.Tier=§8Уровень %s oc:tooltip.NetSplitter=Работает как переключатель. Соединение каждой стороны переключается ключем. При подаче сигнала красного камня все соединения инвертируются. @@ -360,6 +369,9 @@ oc:tooltip.UpgradeHover=Данное улучшение позволяет ро oc:tooltip.UpgradeInventory=Это улучшение даёт место в инвентаре для робота. Без него, роботы не смогут хранить предметы внутри. oc:tooltip.UpgradeInventoryController=Это улучшение позволяет роботу контролировать взаимодействие с внешними инвентарями и позволяет ему менять свой экипированный инструмент предметом из его инвентаря. oc:tooltip.UpgradeLeash=Позволяет некоторым устройствам, таким как дроны, цеплять животных на поводок. Много животных, очень. +oc:tooltip.UpgradeMF=Позволяет адаптерам взаимодействовать с блоками на удалении от них. +oc:tooltip.UpgradeMF.Linked=§fСоединение установлено§7 +oc:tooltip.UpgradeMF.Unlinked=§fНет соединения§7 oc:tooltip.UpgradeNavigation=Позволяет определять положение и ориентацию робота. Положение определяется относительно центра карты, использованной в крафте улучшения. oc:tooltip.UpgradePiston=Позволяет двигать блоки, также как и поршни. §lНе§7 может двигать животных, совсем. oc:tooltip.UpgradeSign=Позволяет читать и писать текст на табличках. From c4fde0dbd214048cad770bd17fbcb341f397ee9b Mon Sep 17 00:00:00 2001 From: Xander Date: Sat, 15 Jul 2017 12:08:57 +0800 Subject: [PATCH 32/37] Fix renderLeash patch signature. --- src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala index cad8fd44e..adac32777 100644 --- a/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala +++ b/src/main/scala/li/cil/oc/common/asm/ClassTransformer.scala @@ -25,7 +25,7 @@ object ObfNames { final val Method_recreateLeash = Array("recreateLeash", "func_110165_bF", "da") final val Method_recreateLeashDesc = Array("()V") final val Method_renderLeash = Array("renderLeash", "func_110827_b", "b") - final val Method_renderLeashDesc = Array("(Lsg;DDDFF)V", "(Lnet/minecraft/entity/EntityLiving;DDDFF)V") + final val Method_renderLeashDesc = Array("(L"+Class_EntityLiving(1)+";DDDFF)V", "(Lnet/minecraft/entity/EntityLiving;DDDFF)V") final val Method_validate = Array("validate", "func_145829_t") final val Method_invalidate = Array("invalidate", "func_145843_s") final val Method_onChunkUnload = Array("onChunkUnload", "func_76623_d") From e4c0df8bfa6d0109f0e59c2103592d399af55ab2 Mon Sep 17 00:00:00 2001 From: payonel Date: Wed, 19 Jul 2017 22:33:41 -0700 Subject: [PATCH 33/37] Add tree utility --- .../opencomputers/loot/openos/bin/tree.lua | 321 ++++++++++++++++++ 1 file changed, 321 insertions(+) create mode 100644 src/main/resources/assets/opencomputers/loot/openos/bin/tree.lua diff --git a/src/main/resources/assets/opencomputers/loot/openos/bin/tree.lua b/src/main/resources/assets/opencomputers/loot/openos/bin/tree.lua new file mode 100644 index 000000000..e831cee04 --- /dev/null +++ b/src/main/resources/assets/opencomputers/loot/openos/bin/tree.lua @@ -0,0 +1,321 @@ +local shell = require("shell") +local fs = require("filesystem") +local tx = require("transforms") +local text = require("text") + +local args, opts = shell.parse(...) + +local function die(...) + io.stderr:write(...) + os.exit(1) +end + +do -- handle cli + if opts.help then + print([[Usage: tree [OPTION]... [FILE]... + -a, --all do not ignore entries starting with . + --full-time with -l, print time in full iso format + -h, --human-readable with -l, print human readable sizes + --si likewise, but use powers of 1000 not 1024 + --level=LEVEL descend only LEVEL directories deep + --color=WHEN WHEN can be + auto - colorize output only if writing to a tty, + always - always colorize output, + never - never colorize output; (default: auto) + -l use a long listing format + -f print the full path prefix for each file + -i do not print indentation lines + -p append "/" indicator to directories + -Q, --quote quote filenames with double quotes + -r, --reverse reverse order while sorting + -S sort by file size + -t sort by modification type, newest first + -X sort alphabetically by entry extension + -C do not count files and directories + -R count root directories like other files + --help print this help and exit]]) + return 0 + end + + if #args == 0 then + table.insert(args, ".") + end + + opts.level = tonumber(opts.level) or math.huge + if opts.level < 1 then + die("Invalid level, must be greater than 0") + end + + opts.color = opts.color or "auto" + if opts.color == "auto" then + opts.color = io.stdout.tty and "always" or "never" + end + + if opts.color ~= "always" and opts.color ~= "never" then + die("Invalid value for --color=WHEN option; WHEN should be auto, always or never") + end +end + +local function peekable(iterator, state, var1) + local nextItem = {iterator(state, var1)} + + return setmetatable({ + peek = function() + return table.unpack(nextItem) + end + }, { + __call = coroutine.wrap(function() + while true do + local item = nextItem + nextItem = {iterator(state, nextItem[1])} + coroutine.yield(table.unpack(item)) + if nextItem[1] == nil then break end + end + end) + }) +end + +local function filter(entry) + return opts.a or entry:sub(1, 1) ~= "." +end + +local function stat(path) + local st = {} + st.path = path + st.name = fs.name(path) or "/" + st.sortName = st.name:gsub("^%.","") + st.time = fs.lastModified(path) + st.isLink = fs.isLink(path) + st.isDirectory = fs.isDirectory(path) + st.size = st.isLink and 0 or fs.size(path) + st.extension = st.name:match("(%.[^.]+)$") or "" + st.fs = fs.get(path) + return st +end + +local colorize +if opts.color == "always" then + -- from /lib/core/full_ls.lua + local colors = tx.foreach(text.split(os.getenv("LS_COLORS") or "", {":"}, true), function(e) + local parts = text.split(e, {"="}, true) + return parts[2], parts[1] + end) + + function colorize(stat) + return stat.isLink and colors.ln or + stat.isDirectory and colors.di or + colors["*" .. stat.extension] or + colors.fi + end +end + +local function list(path) + return coroutine.wrap(function() + local l = {} + for entry in fs.list(path) do + if filter(entry) then + table.insert(l, stat(fs.concat(path, entry))) + end + end + + if opts.S then + table.sort(l, function(a, b) + return a.size < b.size + end) + elseif opts.t then + table.sort(l, function(a, b) + return a.time < b.time + end) + elseif opts.X then + table.sort(l, function(a, b) + return a.extension < b.extension + end) + else + table.sort(l, function(a, b) + return a.sortName < b.sortName + end) + end + + for i = opts.r and #l or 1, opts.r and 1 or #l, opts.r and -1 or 1 do + coroutine.yield(l[i]) + end + end) +end + +local function digRoot(rootPath) + coroutine.yield(stat(rootPath), {}) + + if not fs.isDirectory(rootPath) then + return + end + local iterStack = {peekable(list(rootPath))} + local pathStack = {rootPath} + local levelStack = {not not iterStack[#iterStack]:peek()} + + + repeat + local entry = iterStack[#iterStack]() + + if entry then + levelStack[#levelStack] = not not iterStack[#iterStack]:peek() + + local path = fs.concat(fs.concat(table.unpack(pathStack)), entry.name) + + coroutine.yield(entry, levelStack) + + if entry.isDirectory and opts.level > #levelStack then + table.insert(iterStack, peekable(list(path))) + table.insert(pathStack, entry.name) + table.insert(levelStack, not not iterStack[#iterStack]:peek()) + end + else + table.remove(iterStack) + table.remove(pathStack) + table.remove(levelStack) + end + until #iterStack == 0 +end + +local function dig(roots) + return coroutine.wrap(function() + for _, root in ipairs(roots) do + digRoot(root) + end + end) +end + +local function nod(n) -- from /lib/core/full_ls.lua + return n and (tostring(n):gsub("(%.[0-9]+)0+$","%1")) or "0" +end + +local function formatFSize(size) -- from /lib/core/full_ls.lua + if not opts.h and not opts["human-readable"] and not opts.si then + return tostring(size) + end + + local sizes = {"", "K", "M", "G"} + local unit = 1 + local power = opts.si and 1000 or 1024 + + while size > power and unit < #sizes do + unit = unit + 1 + size = size / power + end + + return nod(math.floor(size*10)/10)..sizes[unit] +end + +local function pad(txt) -- from /lib/core/full_ls.lua + txt = tostring(txt) + return #txt >= 2 and txt or "0" .. txt +end + +local function formatTime(epochms) -- from /lib/core/full_ls.lua + local month_names = {"January","February","March","April","May","June", + "July","August","September","October","November","December"} + + if epochms == 0 then return "" end + + local d = os.date("*t", epochms) + local day, hour, min, sec = nod(d.day), pad(nod(d.hour)), pad(nod(d.min)), pad(nod(d.sec)) + + if opts["full-time"] then + return string.format("%s-%s-%s %s:%s:%s ", d.year, pad(nod(d.month)), pad(day), hour, min, sec) + else + return string.format("%s %+2s %+2s:%+2s ", month_names[d.month]:sub(1,3), day, hour, pad(min)) + end +end + +local function writeEntry(entry, levelStack) + for i, hasNext in ipairs(levelStack) do + if opts.i then break end + + if i == #levelStack then + if hasNext then + io.write("├── ") + else + io.write("└── ") + end + else + if hasNext then + io.write("│   ") + else + io.write(" ") + end + end + end + + if opts.l then + io.write("[") + + io.write(entry.isDirectory and "d" or entry.isLink and "l" or "f", "-") + io.write("r", entry.fs.isReadOnly() and "-" or "w", " ") + + io.write(formatFSize(entry.size), " ") + + io.write(formatTime(entry.time)) + io.write("] ") + end + + if opts.Q then io.write('"') end + + if opts.color == "always" then + io.write("\27[" .. colorize(entry) .. "m") + end + + if opts.f then + io.write(entry.path) + else + io.write(entry.name) + end + + if opts.color == "always" then + io.write("\27[0m") + end + + if opts.p and entry.isDirectory then + io.write("/") + end + + if opts.Q then io.write('"') end + io.write("\n") +end + +local function writeCount(dirs, files) + io.write("\n") + io.write(dirs, " director", dirs == 1 and "y" or "ies") + io.write(", ") + io.write(files, " file", files == 1 and "" or "s") + io.write("\n") +end + +local dirs, files = 0, 0 + +local roots = {} +for _, arg in ipairs(args) do + local path = shell.resolve(arg) + local real, reason = fs.realPath(path) + if not real then + die("cannot access ", path, ": ", reason or "unknown error") + elseif not fs.exists(path) then + die("cannot access ", path, ":", "No such file or directory") + else + table.insert(roots, real) + end +end + +for entry, levelStack in dig(roots) do + if opts.R or #levelStack > 0 then + if entry.isDirectory then + dirs = dirs + 1 + else + files = files + 1 + end + end + writeEntry(entry, levelStack) +end + +if not opts.C then + writeCount(dirs, files) +end + From de080b28efac9cb1dcde795a3d50f520adb288e5 Mon Sep 17 00:00:00 2001 From: payonel Date: Wed, 19 Jul 2017 22:33:54 -0700 Subject: [PATCH 34/37] Add SHODAN to list of robot names Adds a recognizable AI not on this list, SHODAN from the System Shock games. --- src/main/resources/assets/opencomputers/robot.names | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/assets/opencomputers/robot.names b/src/main/resources/assets/opencomputers/robot.names index 27047dffa..1635f27cc 100644 --- a/src/main/resources/assets/opencomputers/robot.names +++ b/src/main/resources/assets/opencomputers/robot.names @@ -88,6 +88,7 @@ Robby # Forbidden Planet Roomba # Under your couch... wait. Rosie # The Jetsons Shakey # The first general-purpose mobile robot that could reason about its actions. +SHODAN # System Shock Skynet # Terminator Space Core # Portal SpiritedDusty # Contributor From cdc8b2d792845566a13b006281afa7146a5e4795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 22 Jul 2017 14:50:56 +0200 Subject: [PATCH 35/37] Fix for infinite loop in manual, closes #2395. --- .../markdown/segment/BasicTextSegment.scala | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala b/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala index 07ad82e7a..365577fe4 100644 --- a/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala +++ b/src/main/scala/li/cil/oc/client/renderer/markdown/segment/BasicTextSegment.scala @@ -1,7 +1,6 @@ package li.cil.oc.client.renderer.markdown.segment -import li.cil.oc.client.renderer.markdown.Document -import li.cil.oc.client.renderer.markdown.MarkupFormat +import li.cil.oc.client.renderer.markdown.{Document, MarkupFormat} import net.minecraft.client.gui.FontRenderer trait BasicTextSegment extends Segment { @@ -58,11 +57,21 @@ trait BasicTextSegment extends Segment { while (pos < s.length) { pos += 1 val width = stringWidth(s.take(pos), renderer) - if (width >= maxWidth) { - if (lastBreak > 0 || fullWidth <= maxLineWidth || s.exists(breaks.contains)) - if (maxWidth == maxLineWidth && fullWidth == maxLineWidth && !s.exists(breaks.contains)) return s.length - else return lastBreak + 1 - else return pos - 1 + val exceedsLineLength = width >= maxWidth + if (exceedsLineLength) { + val mayUseFullLine = maxWidth == maxLineWidth + val canFitInLine = fullWidth <= maxLineWidth + val matchesFullLine = fullWidth == maxLineWidth + if (lastBreak >= 0) { + return lastBreak + 1 // Can do a soft split. + } + if (mayUseFullLine && matchesFullLine) { + return s.length // Special case for exact match. + } + if (canFitInLine && !mayUseFullLine) { + return 0 // Wrap line, use next line. + } + return pos - 1 // Gotta split hard. } if (pos < s.length && breaks.contains(s.charAt(pos))) lastBreak = pos } From 70f8eeb2757b3929e1a8886310272281cfdcd92a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 22 Jul 2017 15:57:03 +0200 Subject: [PATCH 36/37] 1.12 adjustments. --- src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java b/src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java index f44353527..e8ac07d70 100644 --- a/src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java +++ b/src/main/java/li/cil/oc/api/prefab/ItemStackArrayValue.java @@ -44,7 +44,7 @@ public class ItemStackArrayValue extends AbstractValue { if (this.iteratorIndex >= this.array.length) return null; int index = this.iteratorIndex++; - if (this.array[index] == null)//TODO 1.11 change to ItemStack.EMPTY? + if (this.array[index] == null || this.array[index].isEmpty()) return new Object[]{ emptyMap }; return new Object[]{ this.array[index] != null ? this.array[index] : emptyMap }; } @@ -77,9 +77,9 @@ public class ItemStackArrayValue extends AbstractValue { for (int i = 0; i < tagList.tagCount(); ++i){ NBTTagCompound el = tagList.getCompoundTagAt(i); if (el.hasNoTags()) - this.array[i] = null;//TODO 1.11 change to ItemStack.EMPTY? + this.array[i] = ItemStack.EMPTY; else - this.array[i] = ItemStack.loadItemStackFromNBT(el); + this.array[i] = new ItemStack(el); } } else { this.array = null; From 67895541c69147608d1df6a1fb579f5253a718c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Sat, 22 Jul 2017 18:15:16 +0200 Subject: [PATCH 37/37] Fix adapter bottom texture. --- .../resources/assets/opencomputers/models/block/adapter.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/assets/opencomputers/models/block/adapter.json b/src/main/resources/assets/opencomputers/models/block/adapter.json index a20ea7f23..a535714b8 100644 --- a/src/main/resources/assets/opencomputers/models/block/adapter.json +++ b/src/main/resources/assets/opencomputers/models/block/adapter.json @@ -1,7 +1,7 @@ { "parent": "block/cube_bottom_top", "textures": { - "bottom": "opencomputers:blocks/generic_top", + "bottom": "opencomputers:blocks/adapter_top", "top": "opencomputers:blocks/adapter_top", "side": "opencomputers:blocks/adapter_side" }