mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-14 17:56:34 -04:00
Add NBT editing functionality to Debug Card
This commit is contained in:
parent
8e190a02e7
commit
ac3b928a2f
@ -25,8 +25,8 @@ import net.minecraft.block.Block
|
|||||||
import net.minecraft.entity.player.EntityPlayerMP
|
import net.minecraft.entity.player.EntityPlayerMP
|
||||||
import net.minecraft.item.Item
|
import net.minecraft.item.Item
|
||||||
import net.minecraft.item.ItemStack
|
import net.minecraft.item.ItemStack
|
||||||
import net.minecraft.nbt.JsonToNBT
|
import net.minecraft.nbt._
|
||||||
import net.minecraft.nbt.NBTTagCompound
|
import net.minecraft.nbt.NBTBase.NBTPrimitive
|
||||||
import net.minecraft.server.MinecraftServer
|
import net.minecraft.server.MinecraftServer
|
||||||
import net.minecraft.server.management.UserListOpsEntry
|
import net.minecraft.server.management.UserListOpsEntry
|
||||||
import net.minecraft.util.IChatComponent
|
import net.minecraft.util.IChatComponent
|
||||||
@ -317,6 +317,76 @@ object DebugCard {
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------- //
|
// ----------------------------------------------------------------------- //
|
||||||
|
|
||||||
|
def getMap(tag: NBTTagCompound): java.util.Map[String, Any] = {
|
||||||
|
val keys = tag.func_150296_c().asInstanceOf[java.util.Set[String]]
|
||||||
|
val map = new java.util.HashMap[String, Any]()
|
||||||
|
for (key <- keys) {
|
||||||
|
val keyMap = new java.util.HashMap[String, Any]()
|
||||||
|
map.put(key, keyMap)
|
||||||
|
val nbt = tag.getTag(key)
|
||||||
|
keyMap.put("type", nbt.getId)
|
||||||
|
if (nbt.isInstanceOf[NBTTagCompound]) keyMap.put("value", getMap(nbt.asInstanceOf[NBTTagCompound]))
|
||||||
|
else if (nbt.isInstanceOf[NBTPrimitive]) keyMap.put("value", nbt.asInstanceOf[NBTPrimitive].func_150286_g())
|
||||||
|
else if (nbt.isInstanceOf[NBTTagString]) keyMap.put("value", nbt.asInstanceOf[NBTTagString].func_150285_a_())
|
||||||
|
else if (nbt.isInstanceOf[NBTTagList]) {
|
||||||
|
val array = new java.util.HashMap[Integer, Any]()
|
||||||
|
val tagList = nbt.asInstanceOf[NBTTagList]
|
||||||
|
for (i <- 0 until tagList.tagCount()) array.put(i + 1, getMap(tagList.getCompoundTagAt(i)))
|
||||||
|
keyMap.put("value", array)
|
||||||
|
} else if (nbt.isInstanceOf[NBTTagIntArray]) {
|
||||||
|
val array = new java.util.HashMap[Integer, Any]()
|
||||||
|
val tagIntList = nbt.asInstanceOf[NBTTagIntArray].func_150302_c()
|
||||||
|
for (i <- 0 until tagIntList.length) array.put(i + 1, tagIntList(i))
|
||||||
|
keyMap.put("value", array)
|
||||||
|
} else if (nbt.isInstanceOf[NBTTagByteArray]) {
|
||||||
|
val array = new java.util.HashMap[Integer, Any]()
|
||||||
|
val tagByteList = nbt.asInstanceOf[NBTTagByteArray].func_150292_c()
|
||||||
|
for (i <- 0 until tagByteList.length) array.put(i + 1, tagByteList(i))
|
||||||
|
keyMap.put("value", array)
|
||||||
|
} else throw new Exception("NBT tag " + NBTBase.NBTTypes(nbt.getId) + " is unsupported")
|
||||||
|
}
|
||||||
|
map
|
||||||
|
}
|
||||||
|
|
||||||
|
def getTag(map: java.util.Map[String, Any]): NBTTagCompound = {
|
||||||
|
val tag = new NBTTagCompound()
|
||||||
|
for ((key, value) <- map) {
|
||||||
|
val keyObject = value.asInstanceOf[java.util.Map[String, Any]]
|
||||||
|
val `type` = keyObject.get("type").asInstanceOf[Double].intValue()
|
||||||
|
val element = keyObject.get("value")
|
||||||
|
`type` match {
|
||||||
|
case 1 => tag.setByte(key, element.asInstanceOf[Double].byteValue())
|
||||||
|
case 2 => tag.setShort(key, element.asInstanceOf[Double].shortValue())
|
||||||
|
case 3 => tag.setInteger(key, element.asInstanceOf[Double].intValue())
|
||||||
|
case 4 => tag.setLong(key, element.asInstanceOf[Double].longValue())
|
||||||
|
case 5 => tag.setFloat(key, element.asInstanceOf[Double].floatValue())
|
||||||
|
case 6 => tag.setDouble(key, element.asInstanceOf[Double])
|
||||||
|
case 7 =>
|
||||||
|
var jbArray = element.asInstanceOf[java.util.Map[Integer, Any]]
|
||||||
|
var bArray = Array.ofDim[Byte](jbArray.size)
|
||||||
|
for (i <- 0 until jbArray.size) bArray(i) = jbArray.get(i + 1).asInstanceOf[Double].byteValue()
|
||||||
|
tag.setByteArray(key, bArray)
|
||||||
|
|
||||||
|
case 8 => tag.setString(key, element.asInstanceOf[String])
|
||||||
|
case 9 =>
|
||||||
|
var array = element.asInstanceOf[java.util.Map[Integer, Any]]
|
||||||
|
var tagList = new NBTTagList()
|
||||||
|
for ((key, value) <- array) tagList.appendTag(getTag(value.asInstanceOf[java.util.Map[String, Any]]))
|
||||||
|
tag.setTag(key, tagList)
|
||||||
|
|
||||||
|
case 10 => tag.setTag(key, getTag(element.asInstanceOf[java.util.Map[String, Any]]))
|
||||||
|
case 11 =>
|
||||||
|
var ibArray = element.asInstanceOf[java.util.Map[Integer, Any]]
|
||||||
|
var iArray = Array.ofDim[Int](ibArray.size)
|
||||||
|
for (i <- 0 until ibArray.size) iArray(i) = ibArray.get(i + 1).asInstanceOf[Double].intValue()
|
||||||
|
tag.setIntArray(key, iArray)
|
||||||
|
|
||||||
|
case _ => throw new Exception("NBT type #" + `type` + " is unsupported")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tag
|
||||||
|
}
|
||||||
|
|
||||||
@Callback(doc = """function():number -- Gets the numeric id of the current dimension.""")
|
@Callback(doc = """function():number -- Gets the numeric id of the current dimension.""")
|
||||||
def getDimensionId(context: Context, args: Arguments): Array[AnyRef] = {
|
def getDimensionId(context: Context, args: Arguments): Array[AnyRef] = {
|
||||||
checkEnabled()
|
checkEnabled()
|
||||||
@ -415,6 +485,33 @@ object DebugCard {
|
|||||||
result(block != null && block.hasTileEntity(world.getBlockMetadata(x, y, z)))
|
result(block != null && block.hasTileEntity(world.getBlockMetadata(x, y, z)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Callback(doc = """function(x:number, y:number, z:number):table -- Get the NBT of the block at the specified coordinates.""")
|
||||||
|
def getTileNBT(context: Context, args: Arguments): Array[AnyRef] = {
|
||||||
|
checkEnabled()
|
||||||
|
val (x, y, z) = (args.checkInteger(0), args.checkInteger(1), args.checkInteger(2))
|
||||||
|
val tileEntity = world.getTileEntity(x, y, z)
|
||||||
|
if (tileEntity != null) {
|
||||||
|
val tag = new NBTTagCompound()
|
||||||
|
tileEntity.writeToNBT(tag)
|
||||||
|
return result(getMap(tag))
|
||||||
|
}
|
||||||
|
result(null)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Callback(doc = """function(x:number, y:number, z:number, nbt:table):boolean -- Set the NBT of the block at the specified coordinates.""")
|
||||||
|
def setTileNBT(context: Context, args: Arguments): Array[AnyRef] = {
|
||||||
|
checkEnabled()
|
||||||
|
val (x, y, z) = (args.checkInteger(0), args.checkInteger(1), args.checkInteger(2))
|
||||||
|
val nbt = args.checkTable(3).asInstanceOf[java.util.Map[String,Any]]
|
||||||
|
val tileEntity = world.getTileEntity(x, y, z)
|
||||||
|
if (tileEntity != null) {
|
||||||
|
val tag = getTag(nbt)
|
||||||
|
tileEntity.readFromNBT(tag)
|
||||||
|
return result(true)
|
||||||
|
}
|
||||||
|
result(null)
|
||||||
|
}
|
||||||
|
|
||||||
@Callback(doc = """function(x:number, y:number, z:number):number -- Get the light opacity of the block at the specified coordinates.""")
|
@Callback(doc = """function(x:number, y:number, z:number):number -- Get the light opacity of the block at the specified coordinates.""")
|
||||||
def getLightOpacity(context: Context, args: Arguments): Array[AnyRef] = {
|
def getLightOpacity(context: Context, args: Arguments): Array[AnyRef] = {
|
||||||
checkEnabled()
|
checkEnabled()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user