CompoundTag.java

net.minecraft.nbt.CompoundTag

信息

  • 全限定名:net.minecraft.nbt.CompoundTag
  • 类型:public final class
  • 包:net.minecraft.nbt
  • 源码路径:src/main/java/net/minecraft/nbt/CompoundTag.java
  • 起始行号:L26
  • 实现:Tag
  • 职责:

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L27
    • 说明:

      TODO

  • CODEC

    • 类型: Codec<CompoundTag>
    • 修饰符: public static final
    • 源码定位: L28
    • 说明:

      TODO

  • SELF_SIZE_IN_BYTES

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L38
    • 说明:

      TODO

  • MAP_ENTRY_SIZE_IN_BYTES

    • 类型: int
    • 修饰符: private static final
    • 源码定位: L39
    • 说明:

      TODO

  • TYPE

    • 类型: TagType<CompoundTag>
    • 修饰符: public static final public private static public private static default default private static public public public
    • 源码定位: L40
    • 说明:

      TODO

  • tags

    • 类型: Map<String,Tag>
    • 修饰符: private final
    • 源码定位: L166
    • 说明:

      TODO

内部类/嵌套类型

构造器

CompoundTag(Map<String,Tag> tags) @ L168

  • 构造器名:CompoundTag
  • 源码定位:L168
  • 修饰符:package-private

参数:

  • tags: Map<String,Tag>

说明:

TODO

public CompoundTag() @ L172

  • 构造器名:CompoundTag
  • 源码定位:L172
  • 修饰符:public

参数:

说明:

TODO

方法

下面的方法块按源码顺序生成。

public void write(DataOutput output) @ L176

  • 方法名:write
  • 源码定位:L176
  • 返回类型:void
  • 修饰符:public

参数:

  • output: DataOutput

说明:

TODO

public int sizeInBytes() @ L186

  • 方法名:sizeInBytes
  • 源码定位:L186
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public Set<String> keySet() @ L199

  • 方法名:keySet
  • 源码定位:L199
  • 返回类型:Set
  • 修饰符:public

参数:

说明:

TODO

public Set<Entry<String,Tag>> entrySet() @ L203

  • 方法名:entrySet
  • 源码定位:L203
  • 返回类型:Set<Entry<String,Tag>>
  • 修饰符:public

参数:

说明:

TODO

public Collection<Tag> values() @ L207

  • 方法名:values
  • 源码定位:L207
  • 返回类型:Collection
  • 修饰符:public

参数:

说明:

TODO

public void forEach(BiConsumer<String,Tag> consumer) @ L211

  • 方法名:forEach
  • 源码定位:L211
  • 返回类型:void
  • 修饰符:public

参数:

  • consumer: BiConsumer<String,Tag>

说明:

TODO

public byte getId() @ L215

  • 方法名:getId
  • 源码定位:L215
  • 返回类型:byte
  • 修饰符:public

参数:

说明:

TODO

public TagType<CompoundTag> getType() @ L220

  • 方法名:getType
  • 源码定位:L220
  • 返回类型:TagType
  • 修饰符:public

参数:

说明:

TODO

public int size() @ L225

  • 方法名:size
  • 源码定位:L225
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

public Tag put(String name, Tag tag) @ L229

  • 方法名:put
  • 源码定位:L229
  • 返回类型:Tag
  • 修饰符:public

参数:

  • name: String
  • tag: Tag

说明:

TODO

public void putByte(String name, byte value) @ L233

  • 方法名:putByte
  • 源码定位:L233
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: byte

说明:

TODO

public void putShort(String name, short value) @ L237

  • 方法名:putShort
  • 源码定位:L237
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: short

说明:

TODO

public void putInt(String name, int value) @ L241

  • 方法名:putInt
  • 源码定位:L241
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: int

说明:

TODO

public void putLong(String name, long value) @ L245

  • 方法名:putLong
  • 源码定位:L245
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: long

说明:

TODO

public void putFloat(String name, float value) @ L249

  • 方法名:putFloat
  • 源码定位:L249
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: float

说明:

TODO

public void putDouble(String name, double value) @ L253

  • 方法名:putDouble
  • 源码定位:L253
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: double

说明:

TODO

public void putString(String name, String value) @ L257

  • 方法名:putString
  • 源码定位:L257
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: String

说明:

TODO

public void putByteArray(String name, byte[] value) @ L261

  • 方法名:putByteArray
  • 源码定位:L261
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: byte[]

说明:

TODO

public void putIntArray(String name, int[] value) @ L265

  • 方法名:putIntArray
  • 源码定位:L265
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: int[]

说明:

TODO

public void putLongArray(String name, long[] value) @ L269

  • 方法名:putLongArray
  • 源码定位:L269
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: long[]

说明:

TODO

public void putBoolean(String name, boolean value) @ L273

  • 方法名:putBoolean
  • 源码定位:L273
  • 返回类型:void
  • 修饰符:public

参数:

  • name: String
  • value: boolean

说明:

TODO

public Tag get(String name) @ L277

  • 方法名:get
  • 源码定位:L277
  • 返回类型:Tag
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public boolean contains(String name) @ L281

  • 方法名:contains
  • 源码定位:L281
  • 返回类型:boolean
  • 修饰符:public

参数:

  • name: String

说明:

TODO

private Optional<Tag> getOptional(String name) @ L285

  • 方法名:getOptional
  • 源码定位:L285
  • 返回类型:Optional
  • 修饰符:private

参数:

  • name: String

说明:

TODO

public Optional<Byte> getByte(String name) @ L289

  • 方法名:getByte
  • 源码定位:L289
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public byte getByteOr(String name, byte defaultValue) @ L293

  • 方法名:getByteOr
  • 源码定位:L293
  • 返回类型:byte
  • 修饰符:public

参数:

  • name: String
  • defaultValue: byte

说明:

TODO

public Optional<Short> getShort(String name) @ L297

  • 方法名:getShort
  • 源码定位:L297
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public short getShortOr(String name, short defaultValue) @ L301

  • 方法名:getShortOr
  • 源码定位:L301
  • 返回类型:short
  • 修饰符:public

参数:

  • name: String
  • defaultValue: short

说明:

TODO

public Optional<Integer> getInt(String name) @ L305

  • 方法名:getInt
  • 源码定位:L305
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public int getIntOr(String name, int defaultValue) @ L309

  • 方法名:getIntOr
  • 源码定位:L309
  • 返回类型:int
  • 修饰符:public

参数:

  • name: String
  • defaultValue: int

说明:

TODO

public Optional<Long> getLong(String name) @ L313

  • 方法名:getLong
  • 源码定位:L313
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public long getLongOr(String name, long defaultValue) @ L317

  • 方法名:getLongOr
  • 源码定位:L317
  • 返回类型:long
  • 修饰符:public

参数:

  • name: String
  • defaultValue: long

说明:

TODO

public Optional<Float> getFloat(String name) @ L321

  • 方法名:getFloat
  • 源码定位:L321
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public float getFloatOr(String name, float defaultValue) @ L325

  • 方法名:getFloatOr
  • 源码定位:L325
  • 返回类型:float
  • 修饰符:public

参数:

  • name: String
  • defaultValue: float

说明:

TODO

public Optional<Double> getDouble(String name) @ L329

  • 方法名:getDouble
  • 源码定位:L329
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public double getDoubleOr(String name, double defaultValue) @ L333

  • 方法名:getDoubleOr
  • 源码定位:L333
  • 返回类型:double
  • 修饰符:public

参数:

  • name: String
  • defaultValue: double

说明:

TODO

public Optional<String> getString(String name) @ L337

  • 方法名:getString
  • 源码定位:L337
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public String getStringOr(String name, String defaultValue) @ L341

  • 方法名:getStringOr
  • 源码定位:L341
  • 返回类型:String
  • 修饰符:public

参数:

  • name: String
  • defaultValue: String

说明:

TODO

public Optional<byte[]> getByteArray(String name) @ L345

  • 方法名:getByteArray
  • 源码定位:L345
  • 返回类型:Optional<byte[]>
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public Optional<int[]> getIntArray(String name) @ L349

  • 方法名:getIntArray
  • 源码定位:L349
  • 返回类型:Optional<int[]>
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public Optional<long[]> getLongArray(String name) @ L353

  • 方法名:getLongArray
  • 源码定位:L353
  • 返回类型:Optional<long[]>
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public Optional<CompoundTag> getCompound(String name) @ L357

  • 方法名:getCompound
  • 源码定位:L357
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public CompoundTag getCompoundOrEmpty(String name) @ L361

  • 方法名:getCompoundOrEmpty
  • 源码定位:L361
  • 返回类型:CompoundTag
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public Optional<ListTag> getList(String name) @ L365

  • 方法名:getList
  • 源码定位:L365
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public ListTag getListOrEmpty(String name) @ L369

  • 方法名:getListOrEmpty
  • 源码定位:L369
  • 返回类型:ListTag
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public Optional<Boolean> getBoolean(String name) @ L373

  • 方法名:getBoolean
  • 源码定位:L373
  • 返回类型:Optional
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public boolean getBooleanOr(String string, boolean defaultValue) @ L377

  • 方法名:getBooleanOr
  • 源码定位:L377
  • 返回类型:boolean
  • 修饰符:public

参数:

  • string: String
  • defaultValue: boolean

说明:

TODO

public Tag remove(String name) @ L381

  • 方法名:remove
  • 源码定位:L381
  • 返回类型:Tag
  • 修饰符:public

参数:

  • name: String

说明:

TODO

public String toString() @ L385

  • 方法名:toString
  • 源码定位:L385
  • 返回类型:String
  • 修饰符:public

参数:

说明:

TODO

public boolean isEmpty() @ L392

  • 方法名:isEmpty
  • 源码定位:L392
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

protected CompoundTag shallowCopy() @ L396

  • 方法名:shallowCopy
  • 源码定位:L396
  • 返回类型:CompoundTag
  • 修饰符:protected

参数:

说明:

TODO

public CompoundTag copy() @ L400

  • 方法名:copy
  • 源码定位:L400
  • 返回类型:CompoundTag
  • 修饰符:public

参数:

说明:

TODO

public Optional<CompoundTag> asCompound() @ L406

  • 方法名:asCompound
  • 源码定位:L406
  • 返回类型:Optional
  • 修饰符:public

参数:

说明:

TODO

public boolean equals(Object obj) @ L411

  • 方法名:equals
  • 源码定位:L411
  • 返回类型:boolean
  • 修饰符:public

参数:

  • obj: Object

说明:

TODO

public int hashCode() @ L416

  • 方法名:hashCode
  • 源码定位:L416
  • 返回类型:int
  • 修饰符:public

参数:

说明:

TODO

private static void writeNamedTag(String name, Tag tag, DataOutput output) @ L421

  • 方法名:writeNamedTag
  • 源码定位:L421
  • 返回类型:void
  • 修饰符:private static

参数:

  • name: String
  • tag: Tag
  • output: DataOutput

说明:

TODO

private static Tag readNamedTagData(TagType<?> type, String name, DataInput input, NbtAccounter accounter) @ L429

  • 方法名:readNamedTagData
  • 源码定位:L429
  • 返回类型:Tag
  • 修饰符:private static

参数:

  • type: TagType<?>
  • name: String
  • input: DataInput
  • accounter: NbtAccounter

说明:

TODO

public CompoundTag merge(CompoundTag other) @ L441

  • 方法名:merge
  • 源码定位:L441
  • 返回类型:CompoundTag
  • 修饰符:public

参数:

  • other: CompoundTag

说明:

TODO

public void accept(TagVisitor visitor) @ L454

  • 方法名:accept
  • 源码定位:L454
  • 返回类型:void
  • 修饰符:public

参数:

  • visitor: TagVisitor

说明:

TODO

public StreamTagVisitor.ValueResult accept(StreamTagVisitor visitor) @ L459

  • 方法名:accept
  • 源码定位:L459
  • 返回类型:StreamTagVisitor.ValueResult
  • 修饰符:public

参数:

  • visitor: StreamTagVisitor

说明:

TODO

public <T> void store(String name, Codec<T> codec, T value) @ L496

  • 方法名:store
  • 源码定位:L496
  • 返回类型: void
  • 修饰符:public

参数:

  • name: String
  • codec: Codec
  • value: T

说明:

TODO

public <T> void storeNullable(String name, Codec<T> codec, T value) @ L500

  • 方法名:storeNullable
  • 源码定位:L500
  • 返回类型: void
  • 修饰符:public

参数:

  • name: String
  • codec: Codec
  • value: T

说明:

TODO

public <T> void store(String name, Codec<T> codec, DynamicOps<Tag> ops, T value) @ L506

  • 方法名:store
  • 源码定位:L506
  • 返回类型: void
  • 修饰符:public

参数:

  • name: String
  • codec: Codec
  • ops: DynamicOps
  • value: T

说明:

TODO

public <T> void storeNullable(String name, Codec<T> codec, DynamicOps<Tag> ops, T value) @ L510

  • 方法名:storeNullable
  • 源码定位:L510
  • 返回类型: void
  • 修饰符:public

参数:

  • name: String
  • codec: Codec
  • ops: DynamicOps
  • value: T

说明:

TODO

public <T> void store(MapCodec<T> codec, T value) @ L516

  • 方法名:store
  • 源码定位:L516
  • 返回类型: void
  • 修饰符:public

参数:

  • codec: MapCodec
  • value: T

说明:

TODO

public <T> void store(MapCodec<T> codec, DynamicOps<Tag> ops, T value) @ L520

  • 方法名:store
  • 源码定位:L520
  • 返回类型: void
  • 修饰符:public

参数:

  • codec: MapCodec
  • ops: DynamicOps
  • value: T

说明:

TODO

public <T> Optional<T> read(String name, Codec<T> codec) @ L524

  • 方法名:read
  • 源码定位:L524
  • 返回类型: Optional
  • 修饰符:public

参数:

  • name: String
  • codec: Codec

说明:

TODO

public <T> Optional<T> read(String name, Codec<T> codec, DynamicOps<Tag> ops) @ L528

  • 方法名:read
  • 源码定位:L528
  • 返回类型: Optional
  • 修饰符:public

参数:

  • name: String
  • codec: Codec
  • ops: DynamicOps

说明:

TODO

public <T> Optional<T> read(MapCodec<T> codec) @ L535

  • 方法名:read
  • 源码定位:L535
  • 返回类型: Optional
  • 修饰符:public

参数:

  • codec: MapCodec

说明:

TODO

public <T> Optional<T> read(MapCodec<T> codec, DynamicOps<Tag> ops) @ L539

  • 方法名:read
  • 源码定位:L539
  • 返回类型: Optional
  • 修饰符:public

参数:

  • codec: MapCodec
  • ops: DynamicOps

说明:

TODO

代码

public final class CompoundTag implements Tag {
    private static final Logger LOGGER = LogUtils.getLogger();
    public static final Codec<CompoundTag> CODEC = Codec.PASSTHROUGH
        .comapFlatMap(
            t -> {
                Tag tag = t.convert(NbtOps.INSTANCE).getValue();
                return tag instanceof CompoundTag compoundTag
                    ? DataResult.success(compoundTag == t.getValue() ? compoundTag.copy() : compoundTag)
                    : DataResult.error(() -> "Not a compound tag: " + tag);
            },
            t -> new Dynamic<>(NbtOps.INSTANCE, t.copy())
        );
    private static final int SELF_SIZE_IN_BYTES = 48;
    private static final int MAP_ENTRY_SIZE_IN_BYTES = 32;
    public static final TagType<CompoundTag> TYPE = new TagType.VariableSize<CompoundTag>() {
        public CompoundTag load(DataInput input, NbtAccounter accounter) throws IOException {
            accounter.pushDepth();
 
            CompoundTag var3;
            try {
                var3 = loadCompound(input, accounter);
            } finally {
                accounter.popDepth();
            }
 
            return var3;
        }
 
        private static CompoundTag loadCompound(DataInput input, NbtAccounter accounter) throws IOException {
            accounter.accountBytes(48L);
            Map<String, Tag> values = Maps.newHashMap();
 
            byte tagType;
            while ((tagType = input.readByte()) != 0) {
                String key = readString(input, accounter);
                Tag tag = CompoundTag.readNamedTagData(TagTypes.getType(tagType), key, input, accounter);
                if (values.put(key, tag) == null) {
                    accounter.accountBytes(36L);
                }
            }
 
            return new CompoundTag(values);
        }
 
        @Override
        public StreamTagVisitor.ValueResult parse(DataInput input, StreamTagVisitor output, NbtAccounter accounter) throws IOException {
            accounter.pushDepth();
 
            StreamTagVisitor.ValueResult var4;
            try {
                var4 = parseCompound(input, output, accounter);
            } finally {
                accounter.popDepth();
            }
 
            return var4;
        }
 
        private static StreamTagVisitor.ValueResult parseCompound(DataInput input, StreamTagVisitor output, NbtAccounter accounter) throws IOException {
            accounter.accountBytes(48L);
 
            byte tagTypeId;
            label35:
            while ((tagTypeId = input.readByte()) != 0) {
                TagType<?> tagType = TagTypes.getType(tagTypeId);
                switch (output.visitEntry(tagType)) {
                    case HALT:
                        return StreamTagVisitor.ValueResult.HALT;
                    case BREAK:
                        StringTag.skipString(input);
                        tagType.skip(input, accounter);
                        break label35;
                    case SKIP:
                        StringTag.skipString(input);
                        tagType.skip(input, accounter);
                        break;
                    default:
                        String key = readString(input, accounter);
                        switch (output.visitEntry(tagType, key)) {
                            case HALT:
                                return StreamTagVisitor.ValueResult.HALT;
                            case BREAK:
                                tagType.skip(input, accounter);
                                break label35;
                            case SKIP:
                                tagType.skip(input, accounter);
                                break;
                            default:
                                accounter.accountBytes(36L);
                                switch (tagType.parse(input, output, accounter)) {
                                    case HALT:
                                        return StreamTagVisitor.ValueResult.HALT;
                                    case BREAK:
                                }
                        }
                }
            }
 
            if (tagTypeId != 0) {
                while ((tagTypeId = input.readByte()) != 0) {
                    StringTag.skipString(input);
                    TagTypes.getType(tagTypeId).skip(input, accounter);
                }
            }
 
            return output.visitContainerEnd();
        }
 
        private static String readString(DataInput input, NbtAccounter accounter) throws IOException {
            String key = input.readUTF();
            accounter.accountBytes(28L);
            accounter.accountBytes(2L, key.length());
            return key;
        }
 
        @Override
        public void skip(DataInput input, NbtAccounter accounter) throws IOException {
            accounter.pushDepth();
 
            byte tagTypeId;
            try {
                while ((tagTypeId = input.readByte()) != 0) {
                    StringTag.skipString(input);
                    TagTypes.getType(tagTypeId).skip(input, accounter);
                }
            } finally {
                accounter.popDepth();
            }
        }
 
        @Override
        public String getName() {
            return "COMPOUND";
        }
 
        @Override
        public String getPrettyName() {
            return "TAG_Compound";
        }
    };
    private final Map<String, Tag> tags;
 
    CompoundTag(Map<String, Tag> tags) {
        this.tags = tags;
    }
 
    public CompoundTag() {
        this(new HashMap<>());
    }
 
    @Override
    public void write(DataOutput output) throws IOException {
        for (String key : this.tags.keySet()) {
            Tag tag = this.tags.get(key);
            writeNamedTag(key, tag, output);
        }
 
        output.writeByte(0);
    }
 
    @Override
    public int sizeInBytes() {
        int size = 48;
 
        for (Entry<String, Tag> entry : this.tags.entrySet()) {
            size += 28 + 2 * entry.getKey().length();
            size += 36;
            size += entry.getValue().sizeInBytes();
        }
 
        return size;
    }
 
    public Set<String> keySet() {
        return this.tags.keySet();
    }
 
    public Set<Entry<String, Tag>> entrySet() {
        return this.tags.entrySet();
    }
 
    public Collection<Tag> values() {
        return this.tags.values();
    }
 
    public void forEach(BiConsumer<String, Tag> consumer) {
        this.tags.forEach(consumer);
    }
 
    @Override
    public byte getId() {
        return 10;
    }
 
    @Override
    public TagType<CompoundTag> getType() {
        return TYPE;
    }
 
    public int size() {
        return this.tags.size();
    }
 
    public @Nullable Tag put(String name, Tag tag) {
        return this.tags.put(name, tag);
    }
 
    public void putByte(String name, byte value) {
        this.tags.put(name, ByteTag.valueOf(value));
    }
 
    public void putShort(String name, short value) {
        this.tags.put(name, ShortTag.valueOf(value));
    }
 
    public void putInt(String name, int value) {
        this.tags.put(name, IntTag.valueOf(value));
    }
 
    public void putLong(String name, long value) {
        this.tags.put(name, LongTag.valueOf(value));
    }
 
    public void putFloat(String name, float value) {
        this.tags.put(name, FloatTag.valueOf(value));
    }
 
    public void putDouble(String name, double value) {
        this.tags.put(name, DoubleTag.valueOf(value));
    }
 
    public void putString(String name, String value) {
        this.tags.put(name, StringTag.valueOf(value));
    }
 
    public void putByteArray(String name, byte[] value) {
        this.tags.put(name, new ByteArrayTag(value));
    }
 
    public void putIntArray(String name, int[] value) {
        this.tags.put(name, new IntArrayTag(value));
    }
 
    public void putLongArray(String name, long[] value) {
        this.tags.put(name, new LongArrayTag(value));
    }
 
    public void putBoolean(String name, boolean value) {
        this.tags.put(name, ByteTag.valueOf(value));
    }
 
    public @Nullable Tag get(String name) {
        return this.tags.get(name);
    }
 
    public boolean contains(String name) {
        return this.tags.containsKey(name);
    }
 
    private Optional<Tag> getOptional(String name) {
        return Optional.ofNullable(this.tags.get(name));
    }
 
    public Optional<Byte> getByte(String name) {
        return this.getOptional(name).flatMap(Tag::asByte);
    }
 
    public byte getByteOr(String name, byte defaultValue) {
        return this.tags.get(name) instanceof NumericTag tag ? tag.byteValue() : defaultValue;
    }
 
    public Optional<Short> getShort(String name) {
        return this.getOptional(name).flatMap(Tag::asShort);
    }
 
    public short getShortOr(String name, short defaultValue) {
        return this.tags.get(name) instanceof NumericTag tag ? tag.shortValue() : defaultValue;
    }
 
    public Optional<Integer> getInt(String name) {
        return this.getOptional(name).flatMap(Tag::asInt);
    }
 
    public int getIntOr(String name, int defaultValue) {
        return this.tags.get(name) instanceof NumericTag tag ? tag.intValue() : defaultValue;
    }
 
    public Optional<Long> getLong(String name) {
        return this.getOptional(name).flatMap(Tag::asLong);
    }
 
    public long getLongOr(String name, long defaultValue) {
        return this.tags.get(name) instanceof NumericTag tag ? tag.longValue() : defaultValue;
    }
 
    public Optional<Float> getFloat(String name) {
        return this.getOptional(name).flatMap(Tag::asFloat);
    }
 
    public float getFloatOr(String name, float defaultValue) {
        return this.tags.get(name) instanceof NumericTag tag ? tag.floatValue() : defaultValue;
    }
 
    public Optional<Double> getDouble(String name) {
        return this.getOptional(name).flatMap(Tag::asDouble);
    }
 
    public double getDoubleOr(String name, double defaultValue) {
        return this.tags.get(name) instanceof NumericTag tag ? tag.doubleValue() : defaultValue;
    }
 
    public Optional<String> getString(String name) {
        return this.getOptional(name).flatMap(Tag::asString);
    }
 
    public String getStringOr(String name, String defaultValue) {
        return this.tags.get(name) instanceof StringTag(String var8) ? var8 : defaultValue;
    }
 
    public Optional<byte[]> getByteArray(String name) {
        return this.tags.get(name) instanceof ByteArrayTag tag ? Optional.of(tag.getAsByteArray()) : Optional.empty();
    }
 
    public Optional<int[]> getIntArray(String name) {
        return this.tags.get(name) instanceof IntArrayTag tag ? Optional.of(tag.getAsIntArray()) : Optional.empty();
    }
 
    public Optional<long[]> getLongArray(String name) {
        return this.tags.get(name) instanceof LongArrayTag tag ? Optional.of(tag.getAsLongArray()) : Optional.empty();
    }
 
    public Optional<CompoundTag> getCompound(String name) {
        return this.tags.get(name) instanceof CompoundTag tag ? Optional.of(tag) : Optional.empty();
    }
 
    public CompoundTag getCompoundOrEmpty(String name) {
        return this.getCompound(name).orElseGet(CompoundTag::new);
    }
 
    public Optional<ListTag> getList(String name) {
        return this.tags.get(name) instanceof ListTag tag ? Optional.of(tag) : Optional.empty();
    }
 
    public ListTag getListOrEmpty(String name) {
        return this.getList(name).orElseGet(ListTag::new);
    }
 
    public Optional<Boolean> getBoolean(String name) {
        return this.getOptional(name).flatMap(Tag::asBoolean);
    }
 
    public boolean getBooleanOr(String string, boolean defaultValue) {
        return this.getByteOr(string, (byte)(defaultValue ? 1 : 0)) != 0;
    }
 
    public @Nullable Tag remove(String name) {
        return this.tags.remove(name);
    }
 
    @Override
    public String toString() {
        StringTagVisitor visitor = new StringTagVisitor();
        visitor.visitCompound(this);
        return visitor.build();
    }
 
    public boolean isEmpty() {
        return this.tags.isEmpty();
    }
 
    protected CompoundTag shallowCopy() {
        return new CompoundTag(new HashMap<>(this.tags));
    }
 
    public CompoundTag copy() {
        HashMap<String, Tag> newTags = new HashMap<>();
        this.tags.forEach((key, tag) -> newTags.put(key, tag.copy()));
        return new CompoundTag(newTags);
    }
 
    @Override
    public Optional<CompoundTag> asCompound() {
        return Optional.of(this);
    }
 
    @Override
    public boolean equals(Object obj) {
        return this == obj ? true : obj instanceof CompoundTag && Objects.equals(this.tags, ((CompoundTag)obj).tags);
    }
 
    @Override
    public int hashCode() {
        return this.tags.hashCode();
    }
 
    private static void writeNamedTag(String name, Tag tag, DataOutput output) throws IOException {
        output.writeByte(tag.getId());
        if (tag.getId() != 0) {
            output.writeUTF(name);
            tag.write(output);
        }
    }
 
    private static Tag readNamedTagData(TagType<?> type, String name, DataInput input, NbtAccounter accounter) {
        try {
            return type.load(input, accounter);
        } catch (IOException var7) {
            CrashReport report = CrashReport.forThrowable(var7, "Loading NBT data");
            CrashReportCategory category = report.addCategory("NBT Tag");
            category.setDetail("Tag name", name);
            category.setDetail("Tag type", type.getName());
            throw new ReportedNbtException(report);
        }
    }
 
    public CompoundTag merge(CompoundTag other) {
        for (String tagName : other.tags.keySet()) {
            Tag otherTag = other.tags.get(tagName);
            if (otherTag instanceof CompoundTag otherCompound && this.tags.get(tagName) instanceof CompoundTag selfCompound) {
                selfCompound.merge(otherCompound);
            } else {
                this.put(tagName, otherTag.copy());
            }
        }
 
        return this;
    }
 
    @Override
    public void accept(TagVisitor visitor) {
        visitor.visitCompound(this);
    }
 
    @Override
    public StreamTagVisitor.ValueResult accept(StreamTagVisitor visitor) {
        for (Entry<String, Tag> entry : this.tags.entrySet()) {
            Tag value = entry.getValue();
            TagType<?> type = value.getType();
            StreamTagVisitor.EntryResult entryParseResult = visitor.visitEntry(type);
            switch (entryParseResult) {
                case HALT:
                    return StreamTagVisitor.ValueResult.HALT;
                case BREAK:
                    return visitor.visitContainerEnd();
                case SKIP:
                    break;
                default:
                    entryParseResult = visitor.visitEntry(type, entry.getKey());
                    switch (entryParseResult) {
                        case HALT:
                            return StreamTagVisitor.ValueResult.HALT;
                        case BREAK:
                            return visitor.visitContainerEnd();
                        case SKIP:
                            break;
                        default:
                            StreamTagVisitor.ValueResult valueResult = value.accept(visitor);
                            switch (valueResult) {
                                case HALT:
                                    return StreamTagVisitor.ValueResult.HALT;
                                case BREAK:
                                    return visitor.visitContainerEnd();
                            }
                    }
            }
        }
 
        return visitor.visitContainerEnd();
    }
 
    public <T> void store(String name, Codec<T> codec, T value) {
        this.store(name, codec, NbtOps.INSTANCE, value);
    }
 
    public <T> void storeNullable(String name, Codec<T> codec, @Nullable T value) {
        if (value != null) {
            this.store(name, codec, value);
        }
    }
 
    public <T> void store(String name, Codec<T> codec, DynamicOps<Tag> ops, T value) {
        this.put(name, codec.encodeStart(ops, value).getOrThrow());
    }
 
    public <T> void storeNullable(String name, Codec<T> codec, DynamicOps<Tag> ops, @Nullable T value) {
        if (value != null) {
            this.store(name, codec, ops, value);
        }
    }
 
    public <T> void store(MapCodec<T> codec, T value) {
        this.store(codec, NbtOps.INSTANCE, value);
    }
 
    public <T> void store(MapCodec<T> codec, DynamicOps<Tag> ops, T value) {
        this.merge((CompoundTag)codec.encoder().encodeStart(ops, value).getOrThrow());
    }
 
    public <T> Optional<T> read(String name, Codec<T> codec) {
        return this.read(name, codec, NbtOps.INSTANCE);
    }
 
    public <T> Optional<T> read(String name, Codec<T> codec, DynamicOps<Tag> ops) {
        Tag tag = this.get(name);
        return tag == null
            ? Optional.empty()
            : codec.parse(ops, tag).resultOrPartial(error -> LOGGER.error("Failed to read field ({}={}): {}", name, tag, error));
    }
 
    public <T> Optional<T> read(MapCodec<T> codec) {
        return this.read(codec, NbtOps.INSTANCE);
    }
 
    public <T> Optional<T> read(MapCodec<T> codec, DynamicOps<Tag> ops) {
        return codec.decode(ops, ops.getMap(this).getOrThrow()).resultOrPartial(error -> LOGGER.error("Failed to read value ({}): {}", this, error));
    }
}

引用的其他类

  • CrashReport

    • 引用位置: 方法调用
    • 关联成员: CrashReport.forThrowable()
  • ByteArrayTag

    • 引用位置: 构造调用
    • 关联成员: ByteArrayTag()
  • ByteTag

    • 引用位置: 方法调用
    • 关联成员: ByteTag.valueOf()
  • DoubleTag

    • 引用位置: 方法调用
    • 关联成员: DoubleTag.valueOf()
  • FloatTag

    • 引用位置: 方法调用
    • 关联成员: FloatTag.valueOf()
  • IntArrayTag

    • 引用位置: 构造调用
    • 关联成员: IntArrayTag()
  • IntTag

    • 引用位置: 方法调用
    • 关联成员: IntTag.valueOf()
  • ListTag

    • 引用位置: 返回值
  • LongArrayTag

    • 引用位置: 构造调用
    • 关联成员: LongArrayTag()
  • LongTag

    • 引用位置: 方法调用
    • 关联成员: LongTag.valueOf()
  • NbtAccounter

    • 引用位置: 参数
  • ReportedNbtException

    • 引用位置: 构造调用
    • 关联成员: ReportedNbtException()
  • ShortTag

    • 引用位置: 方法调用
    • 关联成员: ShortTag.valueOf()
  • StreamTagVisitor

    • 引用位置: 参数/返回值
  • StringTag

    • 引用位置: 方法调用
    • 关联成员: StringTag.skipString(), StringTag.valueOf()
  • StringTagVisitor

    • 引用位置: 构造调用
    • 关联成员: StringTagVisitor()
  • Tag

    • 引用位置: 参数/字段/实现/返回值
  • TagType

    • 引用位置: 参数/字段/返回值
  • TagTypes

    • 引用位置: 方法调用
    • 关联成员: TagTypes.getType()
  • TagVisitor

    • 引用位置: 参数