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.forThrowable()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ByteArrayTag()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ByteTag.valueOf()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
DoubleTag.valueOf()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
FloatTag.valueOf()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
IntArrayTag()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
IntTag.valueOf()
- 引用位置:
-
- 引用位置:
返回值
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
LongArrayTag()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
LongTag.valueOf()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ReportedNbtException()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ShortTag.valueOf()
- 引用位置:
-
- 引用位置:
参数/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
StringTag.skipString(), StringTag.valueOf()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
StringTagVisitor()
- 引用位置:
-
- 引用位置:
参数/字段/实现/返回值
- 引用位置:
-
- 引用位置:
参数/字段/返回值
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
TagTypes.getType()
- 引用位置:
-
- 引用位置:
参数
- 引用位置: