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 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(); } }