mirror of
https://github.com/MightyPirates/OpenComputers.git
synced 2025-09-14 09:46:53 -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.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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user