package com.thebrokenrail.scriptcraft.bridge; import com.thebrokenrail.scriptcraft.util.Util; import net.minecraft.nbt.AbstractListTag; import net.minecraft.nbt.AbstractNumberTag; import net.minecraft.nbt.ByteTag; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.DoubleTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; @SuppressWarnings({"rawtypes", "unchecked"}) class TagBridges { private static Object[] toOut(Tag obj) { Object[] out = new Object[2]; out[0] = false; if (obj instanceof StringTag) { out[1] = obj.asString(); } else if (obj instanceof AbstractNumberTag) { out[1] = ((AbstractNumberTag) obj).getNumber().doubleValue(); } else if (obj instanceof AbstractListTag) { out[0] = true; out[1] = obj; } else if (obj instanceof CompoundTag) { out[1] = obj; } return out; } private static Tag toTag(Object obj) { if (obj instanceof Tag) { return (Tag) obj; } else if (obj instanceof Boolean) { return ByteTag.of((Boolean) obj); } else if (obj instanceof Double) { return DoubleTag.of((Double) obj); } else if (obj instanceof String) { return StringTag.of((String) obj); } else { return null; } } static void register() { Bridges.addBridge("CompoundTag.get", args -> { CompoundTag tag = (CompoundTag) args[0]; Tag obj = tag.get((String) args[1]); return toOut(obj); }); Bridges.addBridge("CompoundTag.set", args -> { CompoundTag tag = (CompoundTag) args[0]; tag.put((String) args[1], toTag(args[2])); return null; }); Bridges.addBridge("CompoundTag.keys", args -> { CompoundTag tag = (CompoundTag) args[0]; return tag.getKeys().toArray(new String[0]); }); Bridges.addBridge("ListTag.get", args -> { AbstractListTag tag = (AbstractListTag) args[0]; Tag obj = tag.get((int) Util.toDouble(args[1], 0)); return toOut(obj); }); Bridges.addBridge("ListTag.set", args -> { AbstractListTag tag = (AbstractListTag) args[0]; tag.set((int) Util.toDouble(args[1], 0), toTag(args[2])); return null; }); Bridges.addBridge("ListTag.size", args -> { AbstractListTag tag = (AbstractListTag) args[0]; return tag.size(); }); Bridges.addBridge("CompoundTag.create", args -> new CompoundTag()); Bridges.addBridge("ListTag.create", args -> new ListTag()); } }