mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-10-01 09:05:09 -04:00
Merge branch 'master' of github.com:MightyPirates/OpenComputers into MC1.7
Conflicts: src/main/scala/li/cil/oc/client/Proxy.scala
This commit is contained in:
commit
e090883d8f
BIN
assets/items.psd
BIN
assets/items.psd
Binary file not shown.
@ -348,7 +348,9 @@ function wrapSingleUserdata(data)
|
|||||||
-- without the need of metamethods like __eq, as well as proper reference
|
-- without the need of metamethods like __eq, as well as proper reference
|
||||||
-- behavior after saving and loading again.
|
-- behavior after saving and loading again.
|
||||||
for k, v in pairs(wrappedUserdata) do
|
for k, v in pairs(wrappedUserdata) do
|
||||||
if v == data then
|
-- We need a custom 'equals' check for userdata because metamethods on
|
||||||
|
-- userdata introduced by JNLua tend to crash the game for some reason.
|
||||||
|
if userdata.equal(v, data) then
|
||||||
return k
|
return k
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 507 B After Width: | Height: | Size: 467 B |
@ -171,6 +171,11 @@ opencomputers {
|
|||||||
# always be erased when the computer is completely powered off, even if
|
# always be erased when the computer is completely powered off, even if
|
||||||
# it crashed. This setting is purely for software-triggered reboots.
|
# it crashed. This setting is purely for software-triggered reboots.
|
||||||
eraseTmpOnReboot: false
|
eraseTmpOnReboot: false
|
||||||
|
|
||||||
|
# Forces the use of the LuaJ fallback instead of the native libraries.
|
||||||
|
# Use this if you have (unfounded) concerns using native libraries or
|
||||||
|
# experience issues with the native library. Also used for debugging.
|
||||||
|
forceLuaJ: false
|
||||||
}
|
}
|
||||||
|
|
||||||
# Robot related settings, what they may do and general balancing.
|
# Robot related settings, what they may do and general balancing.
|
||||||
|
@ -50,6 +50,7 @@ class Settings(config: Config) {
|
|||||||
val allowBytecode = config.getBoolean("computer.allowBytecode")
|
val allowBytecode = config.getBoolean("computer.allowBytecode")
|
||||||
val logLuaCallbackErrors = config.getBoolean("computer.logCallbackErrors")
|
val logLuaCallbackErrors = config.getBoolean("computer.logCallbackErrors")
|
||||||
val eraseTmpOnReboot = config.getBoolean("computer.eraseTmpOnReboot")
|
val eraseTmpOnReboot = config.getBoolean("computer.eraseTmpOnReboot")
|
||||||
|
val forceLuaJ = config.getBoolean("computer.forceLuaJ")
|
||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
// robot
|
// robot
|
||||||
|
@ -6,7 +6,7 @@ import cpw.mods.fml.common.FMLCommonHandler
|
|||||||
import cpw.mods.fml.common.network.NetworkRegistry
|
import cpw.mods.fml.common.network.NetworkRegistry
|
||||||
import li.cil.oc.client
|
import li.cil.oc.client
|
||||||
import li.cil.oc.client.renderer.block.BlockRenderer
|
import li.cil.oc.client.renderer.block.BlockRenderer
|
||||||
import li.cil.oc.client.renderer.item.UpgradeRenderer
|
import li.cil.oc.client.renderer.item.{FloppyRenderer, UpgradeRenderer}
|
||||||
import li.cil.oc.client.renderer.tileentity._
|
import li.cil.oc.client.renderer.tileentity._
|
||||||
import li.cil.oc.client.renderer.WirelessNetworkDebugRenderer
|
import li.cil.oc.client.renderer.WirelessNetworkDebugRenderer
|
||||||
import li.cil.oc.common.{Proxy => CommonProxy, tileentity}
|
import li.cil.oc.common.{Proxy => CommonProxy, tileentity}
|
||||||
@ -45,6 +45,7 @@ private[oc] class Proxy extends CommonProxy {
|
|||||||
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer)
|
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer)
|
||||||
|
|
||||||
MinecraftForgeClient.registerItemRenderer(Items.multi, UpgradeRenderer)
|
MinecraftForgeClient.registerItemRenderer(Items.multi, UpgradeRenderer)
|
||||||
|
MinecraftForgeClient.registerItemRenderer(Items.multi, FloppyRenderer)
|
||||||
|
|
||||||
OpenComputers.channel.register(client.PacketHandler)
|
OpenComputers.channel.register(client.PacketHandler)
|
||||||
|
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
package li.cil.oc.client.renderer.item
|
||||||
|
|
||||||
|
import li.cil.oc.{Settings, api}
|
||||||
|
import net.minecraftforge.client.IItemRenderer
|
||||||
|
import net.minecraftforge.client.IItemRenderer.{ItemRendererHelper, ItemRenderType}
|
||||||
|
import net.minecraft.item.ItemStack
|
||||||
|
import net.minecraft.client.Minecraft
|
||||||
|
import net.minecraft.client.renderer.entity.{RenderItem, RenderManager}
|
||||||
|
import net.minecraft.client.gui.ScaledResolution
|
||||||
|
import org.lwjgl.opengl.GL11
|
||||||
|
import scala.collection.convert.WrapAsScala._
|
||||||
|
import net.minecraft.util.EnumChatFormatting
|
||||||
|
|
||||||
|
object FloppyRenderer extends IItemRenderer {
|
||||||
|
val renderItem = new RenderItem()
|
||||||
|
renderItem.setRenderManager(RenderManager.instance)
|
||||||
|
|
||||||
|
override def handleRenderType(stack: ItemStack, renderType: ItemRenderType) = renderType == ItemRenderType.INVENTORY && {
|
||||||
|
val descriptor = api.Items.get(stack)
|
||||||
|
descriptor == api.Items.get("floppy") ||
|
||||||
|
descriptor == api.Items.get("lootDisk") ||
|
||||||
|
descriptor == api.Items.get("openOS")
|
||||||
|
}
|
||||||
|
|
||||||
|
override def shouldUseRenderHelper(renderType: ItemRenderType, stack: ItemStack, helper: ItemRendererHelper) = false
|
||||||
|
|
||||||
|
override def renderItem(renderType: ItemRenderType, stack: ItemStack, data: AnyRef*) {
|
||||||
|
val mc = Minecraft.getMinecraft
|
||||||
|
renderItem.renderItemIntoGUI(null, mc.getTextureManager, stack, 0, 0)
|
||||||
|
val res = new ScaledResolution(mc.gameSettings, mc.displayWidth, mc.displayHeight)
|
||||||
|
val fontRenderer = renderItem.getFontRendererFromRenderManager
|
||||||
|
if (fontRenderer != null && res.getScaleFactor > 1) {
|
||||||
|
GL11.glPushMatrix()
|
||||||
|
GL11.glTranslatef(4f + 2f / res.getScaleFactor, 9f + 2f / res.getScaleFactor, 0)
|
||||||
|
GL11.glScalef(1f / res.getScaleFactor, 1f / res.getScaleFactor, 1f)
|
||||||
|
val maxLength = (res.getScaleFactor * 7.5).toInt
|
||||||
|
val label =
|
||||||
|
if (stack.hasTagCompound && stack.getTagCompound.hasKey(Settings.namespace + "data") && stack.getTagCompound.getCompoundTag(Settings.namespace + "data").hasKey(Settings.namespace + "fs.label")) {
|
||||||
|
stack.getTagCompound.getCompoundTag(Settings.namespace + "data").getString(Settings.namespace + "fs.label")
|
||||||
|
}
|
||||||
|
else "disk"
|
||||||
|
val lines = fontRenderer.listFormattedStringToWidth(EnumChatFormatting.getTextWithoutFormattingCodes(label), maxLength).take(math.max(1, res.getScaleFactor / 2))
|
||||||
|
for (line <- lines) {
|
||||||
|
fontRenderer.drawString(line.asInstanceOf[String], 0, 0, 0)
|
||||||
|
GL11.glTranslatef(0, fontRenderer.FONT_HEIGHT, 0)
|
||||||
|
}
|
||||||
|
GL11.glPopMatrix()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -42,7 +42,7 @@ class Proxy {
|
|||||||
api.Items.instance = Items
|
api.Items.instance = Items
|
||||||
api.Machine.instance = machine.Machine
|
api.Machine.instance = machine.Machine
|
||||||
api.Machine.LuaArchitecture =
|
api.Machine.LuaArchitecture =
|
||||||
if (LuaStateFactory.isAvailable) classOf[NativeLuaArchitecture]
|
if (LuaStateFactory.isAvailable && !Settings.get.forceLuaJ) classOf[NativeLuaArchitecture]
|
||||||
else classOf[LuaJLuaArchitecture]
|
else classOf[LuaJLuaArchitecture]
|
||||||
api.Network.instance = network.Network
|
api.Network.instance = network.Network
|
||||||
|
|
||||||
|
@ -25,11 +25,14 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
|
|
||||||
private[machine] var memory = 0
|
private[machine] var memory = 0
|
||||||
|
|
||||||
|
private[machine] var bootAddress = ""
|
||||||
|
|
||||||
private val apis = Array(
|
private val apis = Array(
|
||||||
new ComponentAPI(this),
|
new ComponentAPI(this),
|
||||||
new ComputerAPI(this),
|
new ComputerAPI(this),
|
||||||
new OSAPI(this),
|
new OSAPI(this),
|
||||||
new SystemAPI(this),
|
new SystemAPI(this),
|
||||||
|
new UnicodeAPI(this),
|
||||||
new UserdataAPI(this))
|
new UserdataAPI(this))
|
||||||
|
|
||||||
private[machine] def invoke(f: () => Array[AnyRef]): Varargs = try {
|
private[machine] def invoke(f: () => Array[AnyRef]): Varargs = try {
|
||||||
@ -158,16 +161,18 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
// The kernel thread returned. If it threw we'd be in the catch below.
|
// The kernel thread returned. If it threw we'd be in the catch below.
|
||||||
else {
|
else {
|
||||||
// We're expecting the result of a pcall, if anything, so boolean + (result | string).
|
// We're expecting the result of a pcall, if anything, so boolean + (result | string).
|
||||||
if (results.`type`(2) != LuaValue.TBOOLEAN || !(results.isstring(3) || results.isnil(3))) {
|
if (results.`type`(2) != LuaValue.TBOOLEAN || !(results.isstring(3) || results.isnoneornil(3))) {
|
||||||
OpenComputers.log.warning("Kernel returned unexpected results.")
|
OpenComputers.log.warning("Kernel returned unexpected results.")
|
||||||
}
|
}
|
||||||
// The pcall *should* never return normally... but check for it nonetheless.
|
// The pcall *should* never return normally... but check for it nonetheless.
|
||||||
if (results.toboolean(1)) {
|
if (results.toboolean(2)) {
|
||||||
OpenComputers.log.warning("Kernel stopped unexpectedly.")
|
OpenComputers.log.warning("Kernel stopped unexpectedly.")
|
||||||
new ExecutionResult.Shutdown(false)
|
new ExecutionResult.Shutdown(false)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
val error = results.tojstring(3)
|
val error =
|
||||||
|
if (results.isuserdata(3)) results.touserdata(3).toString
|
||||||
|
else results.tojstring(3)
|
||||||
if (error != null) new ExecutionResult.Error(error)
|
if (error != null) new ExecutionResult.Error(error)
|
||||||
else new ExecutionResult.Error("unknown error")
|
else new ExecutionResult.Error("unknown error")
|
||||||
}
|
}
|
||||||
@ -219,6 +224,8 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
override def load(nbt: NBTTagCompound) {
|
override def load(nbt: NBTTagCompound) {
|
||||||
|
bootAddress = nbt.getString("bootAddress")
|
||||||
|
|
||||||
if (machine.isRunning) {
|
if (machine.isRunning) {
|
||||||
machine.stop()
|
machine.stop()
|
||||||
machine.start()
|
machine.start()
|
||||||
@ -226,5 +233,8 @@ class LuaJLuaArchitecture(val machine: api.machine.Machine) extends Architecture
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def save(nbt: NBTTagCompound) {
|
override def save(nbt: NBTTagCompound) {
|
||||||
|
if (bootAddress != null) {
|
||||||
|
nbt.setString("bootAddress", bootAddress)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -241,7 +241,7 @@ class NativeLuaArchitecture(val machine: api.machine.Machine) extends Architectu
|
|||||||
else {
|
else {
|
||||||
assert(lua.isThread(1))
|
assert(lua.isThread(1))
|
||||||
// We're expecting the result of a pcall, if anything, so boolean + (result | string).
|
// We're expecting the result of a pcall, if anything, so boolean + (result | string).
|
||||||
if (!lua.isBoolean(2) || !(lua.isString(3) || lua.isNil(3))) {
|
if (!lua.isBoolean(2) || !(lua.isString(3) || lua.isNoneOrNil(3))) {
|
||||||
OpenComputers.log.warning("Kernel returned unexpected results.")
|
OpenComputers.log.warning("Kernel returned unexpected results.")
|
||||||
}
|
}
|
||||||
// The pcall *should* never return normally... but check for it nonetheless.
|
// The pcall *should* never return normally... but check for it nonetheless.
|
||||||
@ -251,7 +251,9 @@ class NativeLuaArchitecture(val machine: api.machine.Machine) extends Architectu
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
lua.setTotalMemory(Int.MaxValue)
|
lua.setTotalMemory(Int.MaxValue)
|
||||||
val error = lua.toString(3)
|
val error =
|
||||||
|
if (lua.isJavaObjectRaw(3)) lua.toJavaObjectRaw(3).toString
|
||||||
|
else lua.toString(3)
|
||||||
if (error != null) new ExecutionResult.Error(error)
|
if (error != null) new ExecutionResult.Error(error)
|
||||||
else new ExecutionResult.Error("unknown error")
|
else new ExecutionResult.Error("unknown error")
|
||||||
}
|
}
|
||||||
@ -314,6 +316,8 @@ class NativeLuaArchitecture(val machine: api.machine.Machine) extends Architectu
|
|||||||
private def state = machine.asInstanceOf[Machine].state
|
private def state = machine.asInstanceOf[Machine].state
|
||||||
|
|
||||||
override def load(nbt: NBTTagCompound) {
|
override def load(nbt: NBTTagCompound) {
|
||||||
|
bootAddress = nbt.getString("bootAddress")
|
||||||
|
|
||||||
// Unlimit memory use while unpersisting.
|
// Unlimit memory use while unpersisting.
|
||||||
lua.setTotalMemory(Integer.MAX_VALUE)
|
lua.setTotalMemory(Integer.MAX_VALUE)
|
||||||
|
|
||||||
@ -364,6 +368,10 @@ class NativeLuaArchitecture(val machine: api.machine.Machine) extends Architectu
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def save(nbt: NBTTagCompound) {
|
override def save(nbt: NBTTagCompound) {
|
||||||
|
if (bootAddress != null) {
|
||||||
|
nbt.setString("bootAddress", bootAddress)
|
||||||
|
}
|
||||||
|
|
||||||
// Unlimit memory while persisting.
|
// Unlimit memory while persisting.
|
||||||
lua.setTotalMemory(Integer.MAX_VALUE)
|
lua.setTotalMemory(Integer.MAX_VALUE)
|
||||||
|
|
||||||
|
@ -103,6 +103,14 @@ class UserdataAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
|
|||||||
})
|
})
|
||||||
lua.setField(-2, "doc")
|
lua.setField(-2, "doc")
|
||||||
|
|
||||||
|
lua.pushScalaFunction(lua => {
|
||||||
|
val value1 = lua.toJavaObjectRaw(1)
|
||||||
|
val value2 = lua.toJavaObjectRaw(2)
|
||||||
|
lua.pushBoolean(value1.isInstanceOf[Value] && value2.isInstanceOf[Value] && value1 == value2)
|
||||||
|
1
|
||||||
|
})
|
||||||
|
lua.setField(-2, "equal")
|
||||||
|
|
||||||
lua.setGlobal("userdata")
|
lua.setGlobal("userdata")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,6 +27,18 @@ class ComputerAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
|
|||||||
case _ => LuaValue.NIL
|
case _ => LuaValue.NIL
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Get/set address of boot device.
|
||||||
|
computer.set("getBootAddress", (_: Varargs) => owner.bootAddress match {
|
||||||
|
case "" => LuaValue.NIL
|
||||||
|
case address => LuaValue.valueOf(address)
|
||||||
|
})
|
||||||
|
|
||||||
|
computer.set("setBootAddress", (args: Varargs) => {
|
||||||
|
if (args.isnoneornil(1)) owner.bootAddress = ""
|
||||||
|
else owner.bootAddress = args.checkjstring(1)
|
||||||
|
LuaValue.NIL
|
||||||
|
})
|
||||||
|
|
||||||
computer.set("freeMemory", (_: Varargs) => LuaValue.valueOf(owner.memory / 2))
|
computer.set("freeMemory", (_: Varargs) => LuaValue.valueOf(owner.memory / 2))
|
||||||
|
|
||||||
computer.set("totalMemory", (_: Varargs) => LuaValue.valueOf(owner.memory))
|
computer.set("totalMemory", (_: Varargs) => LuaValue.valueOf(owner.memory))
|
||||||
|
@ -13,7 +13,7 @@ class SystemAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
|
|||||||
system.set("allowBytecode", (_: Varargs) => LuaValue.valueOf(Settings.get.allowBytecode))
|
system.set("allowBytecode", (_: Varargs) => LuaValue.valueOf(Settings.get.allowBytecode))
|
||||||
|
|
||||||
// How long programs may run without yielding before we stop them.
|
// How long programs may run without yielding before we stop them.
|
||||||
system.set("timeout", LuaValue.valueOf(Settings.get.timeout))
|
system.set("timeout", (_: Varargs) => LuaValue.valueOf(Settings.get.timeout))
|
||||||
|
|
||||||
lua.set("system", system)
|
lua.set("system", system)
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,12 @@ class UserdataAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
|
|||||||
owner.documentation(() => machine.documentation(value, method))
|
owner.documentation(() => machine.documentation(value, method))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
userdata.set("equal", (args: Varargs) => {
|
||||||
|
val value1 = args.checkuserdata(1, classOf[Value])
|
||||||
|
val value2 = args.checkuserdata(2, classOf[Value])
|
||||||
|
LuaValue.valueOf(value1.isInstanceOf[Value] && value2.isInstanceOf[Value] && value1 == value2)
|
||||||
|
})
|
||||||
|
|
||||||
lua.set("userdata", userdata)
|
lua.set("userdata", userdata)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ import scala.collection.mutable
|
|||||||
import scala.language.implicitConversions
|
import scala.language.implicitConversions
|
||||||
import scala.math.ScalaNumber
|
import scala.math.ScalaNumber
|
||||||
import scala.runtime.BoxedUnit
|
import scala.runtime.BoxedUnit
|
||||||
|
import li.cil.oc.api.machine.Value
|
||||||
|
|
||||||
class ScalaClosure(val f: (Varargs) => Varargs) extends VarArgFunction {
|
class ScalaClosure(val f: (Varargs) => Varargs) extends VarArgFunction {
|
||||||
override def invoke(args: Varargs) = f(args)
|
override def invoke(args: Varargs) = f(args)
|
||||||
@ -41,6 +42,7 @@ object ScalaClosure {
|
|||||||
case value: java.lang.String => LuaValue.valueOf(value)
|
case value: java.lang.String => LuaValue.valueOf(value)
|
||||||
case value: Array[Byte] => LuaValue.valueOf(value)
|
case value: Array[Byte] => LuaValue.valueOf(value)
|
||||||
case value: Array[_] => toLuaList(value)
|
case value: Array[_] => toLuaList(value)
|
||||||
|
case value: Value => LuaValue.userdataOf(value)
|
||||||
case value: Product => toLuaList(value.productIterator.toIterable)
|
case value: Product => toLuaList(value.productIterator.toIterable)
|
||||||
case value: Seq[_] => toLuaList(value)
|
case value: Seq[_] => toLuaList(value)
|
||||||
case value: java.util.Map[_, _] => toLuaTable(value.toMap)
|
case value: java.util.Map[_, _] => toLuaTable(value.toMap)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user