package advancedsystemsmanager.naming;
import advancedsystemsmanager.api.network.IPacketReader;
import advancedsystemsmanager.api.network.IPacketWriter;
import advancedsystemsmanager.helpers.SavableData;
import advancedsystemsmanager.network.ASMPacket;
import advancedsystemsmanager.reference.Reference;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.WorldSavedData;
import java.util.Collection;
public class SaveNameData extends SavableData implements IPacketReader, IPacketWriter
{
private static final String KEY = ".nameData";
private Multimap<Integer, BlockCoord> registry = HashMultimap.create();
public static final int SYNC_ALL = 0;
public static final int ADD = 1;
public static final int REMOVE = 2;
public static final int CHANGE = 3;
public SaveNameData(String key)
{
super(key);
}
public SaveNameData()
{
this(Reference.NETWORK_ID + KEY);
}
@Override
protected SavableData getNew()
{
return new SaveNameData();
}
@Override
public boolean copyFrom(WorldSavedData worldSavedData)
{
if (worldSavedData instanceof SaveNameData)
{
registry = ((SaveNameData) worldSavedData).registry;
return true;
}
return false;
}
private void put(int dim, BlockCoord blockCoord)
{
registry.put(dim, blockCoord);
}
public void put(BlockCoord blockCoord, int dim)
{
registry.put(dim, blockCoord);
markDirty();
}
public void remove(int dim, int x, int y, int z)
{
for (BlockCoord coord : registry.get(dim))
{
if (coord.isAt(x, y, z))
{
registry.remove(dim, coord);
markDirty();
return;
}
}
}
public boolean contains(int dim, int x, int y, int z)
{
for (BlockCoord coord : registry.get(dim))
{
if (coord.isAt(x, y, z))
{
return true;
}
}
return false;
}
@Override
public void writeToNBT(NBTTagCompound tag)
{
NBTTagList list = new NBTTagList();
for (int dim : registry.keySet())
{
if (!registry.get(dim).isEmpty())
{
NBTTagCompound dimensionTag = new NBTTagCompound();
dimensionTag.setByte("w", (byte) dim);
NBTTagList dimList = new NBTTagList();
for (BlockCoord coord : registry.get(dim))
{
if (coord.hasName())
dimList.appendTag(coord.writeToNBT());
}
dimensionTag.setTag("l", dimList);
list.appendTag(dimensionTag);
}
}
tag.setTag("l", list);
}
@Override
public void readFromNBT(NBTTagCompound tag)
{
NBTTagList list = tag.getTagList("l", 10);
for (int i = 0; i < list.tagCount(); i++)
{
NBTTagCompound dimTag = list.getCompoundTagAt(i);
int id = dimTag.getByte("w");
NBTTagList dimList = dimTag.getTagList("l", 10);
for (int j = 0; j < dimList.tagCount(); j++)
{
put(id, new BlockCoord(dimList.getCompoundTagAt(j)));
}
}
}
public String getSavedName(int dim, int x, int y, int z)
{
for (BlockCoord coord : registry.get(dim))
{
if (coord.isAt(x, y, z)) return coord.getName();
}
return null;
}
@Override
public boolean readData(ASMPacket packet)
{
switch(packet.readByte())
{
case SYNC_ALL:
registry.clear();
int dims = packet.readByte();
for (int dim = 0; dim < dims; dim++)
{
int coords = packet.readVarIntFromBuffer();
for (int coord = 0; coord < coords; coord++)
{
BlockCoord blockCoord = new BlockCoord();
blockCoord.readData(packet);
put(dim, blockCoord);
}
}
break;
case ADD:
case CHANGE:
int dim = packet.readByte();
BlockCoord blockCoord = new BlockCoord();
blockCoord.readData(packet);
put(dim, blockCoord);
break;
case REMOVE:
remove(packet.readByte(), packet.readInt(), packet.readUnsignedByte(), packet.readInt());
break;
}
return false;
}
@Override
public boolean writeData(ASMPacket packet)
{
packet.writeByte(SYNC_ALL);
packet.writeByte(registry.keySet().size());
for (int dim : registry.keySet())
{
Collection<BlockCoord> dimList = registry.get(dim);
packet.writeVarIntToBuffer(dimList.size());
for (BlockCoord coord : dimList)
{
coord.writeData(packet);
}
}
return false;
}
public void clear()
{
registry.clear();
}
}