package net.minecraft.world.entity; import io.netty.buffer.ByteBuf; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import net.minecraft.network.codec.ByteBufCodecs; import net.minecraft.network.codec.StreamCodec; public enum Relative { X(0), Y(1), Z(2), Y_ROT(3), X_ROT(4), DELTA_X(5), DELTA_Y(6), DELTA_Z(7), ROTATE_DELTA(8); public static final Set ALL = Set.of(values()); public static final Set ROTATION = Set.of(X_ROT, Y_ROT); public static final Set DELTA = Set.of(DELTA_X, DELTA_Y, DELTA_Z, ROTATE_DELTA); public static final StreamCodec> SET_STREAM_CODEC = ByteBufCodecs.INT.map(Relative::unpack, Relative::pack); private final int bit; @SafeVarargs public static Set union(Set... sets) { HashSet hashSet = new HashSet(); for (Set set : sets) { hashSet.addAll(set); } return hashSet; } private Relative(final int bit) { this.bit = bit; } private int getMask() { return 1 << this.bit; } private boolean isSet(int data) { return (data & this.getMask()) == this.getMask(); } public static Set unpack(int data) { Set set = EnumSet.noneOf(Relative.class); for (Relative relative : values()) { if (relative.isSet(data)) { set.add(relative); } } return set; } public static int pack(Set relatives) { int i = 0; for (Relative relative : relatives) { i |= relative.getMask(); } return i; } }