mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-16 02:39:48 -04:00
Should fix crash in native lib by avoiding the crashing JNLua metacall.
Rendering floppy labels on the floppy in the inventory.
This commit is contained in:
parent
d99bc5815c
commit
9991f4a5fc
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
|
||||
-- behavior after saving and loading again.
|
||||
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
|
||||
end
|
||||
end
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 507 B After Width: | Height: | Size: 467 B |
@ -6,7 +6,7 @@ import cpw.mods.fml.common.network.NetworkRegistry
|
||||
import cpw.mods.fml.common.registry.TickRegistry
|
||||
import cpw.mods.fml.relauncher.Side
|
||||
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.{TextBufferRenderCache, WirelessNetworkDebugRenderer}
|
||||
import li.cil.oc.common.{Proxy => CommonProxy, tileentity}
|
||||
@ -46,6 +46,7 @@ private[oc] class Proxy extends CommonProxy {
|
||||
ClientRegistry.bindTileEntitySpecialRenderer(classOf[tileentity.Screen], ScreenRenderer)
|
||||
|
||||
MinecraftForgeClient.registerItemRenderer(Items.multi.itemID, UpgradeRenderer)
|
||||
MinecraftForgeClient.registerItemRenderer(Items.multi.itemID, FloppyRenderer)
|
||||
|
||||
MinecraftForge.EVENT_BUS.register(gui.Icons)
|
||||
|
||||
|
@ -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.func_110646_a(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()
|
||||
}
|
||||
}
|
||||
}
|
@ -13,7 +13,7 @@ import org.lwjgl.opengl.GL11
|
||||
|
||||
object UpgradeRenderer extends IItemRenderer {
|
||||
val bounds = AxisAlignedBB.getBoundingBox(-0.1, -0.1, -0.1, 0.1, 0.1, 0.1)
|
||||
|
||||
|
||||
override def handleRenderType(stack: ItemStack, renderType: ItemRenderType) = renderType == ItemRenderType.EQUIPPED && {
|
||||
val descriptor = api.Items.get(stack)
|
||||
descriptor == api.Items.get("craftingUpgrade") ||
|
||||
|
@ -241,7 +241,7 @@ class NativeLuaArchitecture(val machine: api.machine.Machine) extends Architectu
|
||||
else {
|
||||
assert(lua.isThread(1))
|
||||
// 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.")
|
||||
}
|
||||
// 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 {
|
||||
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)
|
||||
else new ExecutionResult.Error("unknown error")
|
||||
}
|
||||
|
@ -103,6 +103,14 @@ class UserdataAPI(owner: NativeLuaArchitecture) extends NativeLuaAPI(owner) {
|
||||
})
|
||||
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")
|
||||
}
|
||||
}
|
||||
|
@ -59,6 +59,12 @@ class UserdataAPI(owner: LuaJLuaArchitecture) extends LuaJAPI(owner) {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user