47 lines
1.2 KiB
Java
47 lines
1.2 KiB
Java
package net.minecraft.nbt.visitors;
|
|
|
|
import java.util.ArrayDeque;
|
|
import java.util.Deque;
|
|
import net.minecraft.nbt.CompoundTag;
|
|
import net.minecraft.nbt.StreamTagVisitor;
|
|
import net.minecraft.nbt.TagType;
|
|
|
|
public class SkipFields extends CollectToTag {
|
|
private final Deque<FieldTree> stack = new ArrayDeque();
|
|
|
|
public SkipFields(FieldSelector... selectors) {
|
|
FieldTree fieldTree = FieldTree.createRoot();
|
|
|
|
for (FieldSelector fieldSelector : selectors) {
|
|
fieldTree.addEntry(fieldSelector);
|
|
}
|
|
|
|
this.stack.push(fieldTree);
|
|
}
|
|
|
|
@Override
|
|
public StreamTagVisitor.EntryResult visitEntry(TagType<?> type, String id) {
|
|
FieldTree fieldTree = (FieldTree)this.stack.element();
|
|
if (fieldTree.isSelected(type, id)) {
|
|
return StreamTagVisitor.EntryResult.SKIP;
|
|
} else {
|
|
if (type == CompoundTag.TYPE) {
|
|
FieldTree fieldTree2 = (FieldTree)fieldTree.fieldsToRecurse().get(id);
|
|
if (fieldTree2 != null) {
|
|
this.stack.push(fieldTree2);
|
|
}
|
|
}
|
|
|
|
return super.visitEntry(type, id);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public StreamTagVisitor.ValueResult visitContainerEnd() {
|
|
if (this.depth() == ((FieldTree)this.stack.element()).depth()) {
|
|
this.stack.pop();
|
|
}
|
|
|
|
return super.visitContainerEnd();
|
|
}
|
|
}
|