package openmods.sync;
import com.google.common.collect.Iterators;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Collections;
import java.util.EnumSet;
import java.util.Set;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import openmods.utils.ByteUtils;
import openmods.utils.DirUtils;
import openmods.utils.bitmap.IBitMap;
import openmods.utils.bitmap.IRpcDirectionBitMap;
public class SyncableSides extends SyncableObjectBase implements IRpcDirectionBitMap, IBitMap<ForgeDirection>, ISyncableValueProvider<Set<ForgeDirection>> {
private Set<ForgeDirection> dirs = EnumSet.noneOf(ForgeDirection.class);
private void read(int bits) {
dirs.clear();
Iterators.addAll(dirs, DirUtils.bitsToValidDirs(bits));
}
private int write() {
return ByteUtils.enumSetToBits(dirs);
}
@Override
public void readFromStream(DataInputStream stream) throws IOException {
read(stream.readByte());
}
@Override
public void writeToStream(DataOutputStream stream) throws IOException {
stream.writeByte(write());
}
@Override
public void writeToNBT(NBTTagCompound nbt, String name) {
nbt.setByte(name, (byte)write());
}
@Override
public void readFromNBT(NBTTagCompound nbt, String name) {
read(nbt.getByte(name));
}
@Override
public Set<ForgeDirection> getValue() {
return Collections.unmodifiableSet(dirs);
}
@Override
public void mark(ForgeDirection dir) {
if (dirs.add(dir)) markDirty();
}
@Override
public void clear(ForgeDirection dir) {
if (dirs.remove(dir)) markDirty();
}
@Override
public boolean get(ForgeDirection dir) {
return dirs.contains(dir);
}
@Override
public void clearAll() {
dirs.clear();
markDirty();
}
@Override
public void toggle(ForgeDirection value) {
if (!dirs.remove(value)) dirs.add(value);
markDirty();
}
@Override
public void set(ForgeDirection key, boolean value) {
if (value) dirs.add(key);
else dirs.remove(key);
markDirty();
}
}