Add NBT editing functionality to Debug Card

This commit is contained in:
gamax92 2015-07-26 09:41:44 -06:00
parent 8e190a02e7
commit ac3b928a2f

View File

@ -25,8 +25,8 @@ import net.minecraft.block.Block
import net.minecraft.entity.player.EntityPlayerMP
import net.minecraft.item.Item
import net.minecraft.item.ItemStack
import net.minecraft.nbt.JsonToNBT
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.nbt._
import net.minecraft.nbt.NBTBase.NBTPrimitive
import net.minecraft.server.MinecraftServer
import net.minecraft.server.management.UserListOpsEntry
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.""")
def getDimensionId(context: Context, args: Arguments): Array[AnyRef] = {
checkEnabled()
@ -415,6 +485,33 @@ object DebugCard {
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.""")
def getLightOpacity(context: Context, args: Arguments): Array[AnyRef] = {
checkEnabled()