blob: 04f85fc2ec657d310239a572b6f0c0e0ae9bc492 [file] [log] [blame] [raw]
package mekanism.common.frequency;
import io.netty.buffer.ByteBuf;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import mekanism.api.Coord4D;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.world.World;
import net.minecraft.world.WorldSavedData;
import net.minecraftforge.common.util.Constants.NBT;
public class FrequencyManager
{
public static boolean loaded;
private static Set<FrequencyManager> managers = new HashSet<FrequencyManager>();
private Set<Frequency> frequencies = new HashSet<Frequency>();
private FrequencyDataHandler dataHandler;
private String owner;
private Class<? extends Frequency> frequencyClass;
public FrequencyManager(Class c)
{
frequencyClass = c;
managers.add(this);
}
public FrequencyManager(Class c, String s)
{
this(c);
owner = s;
}
public static void load(World world)
{
loaded = true;
for(FrequencyManager manager : managers)
{
manager.createOrLoad(world);
}
}
public Frequency update(String user, Coord4D coord, Frequency freq)
{
for(Frequency iterFreq : frequencies)
{
if(freq.equals(iterFreq))
{
iterFreq.activeCoords.add(coord);
return iterFreq;
}
}
return null;
}
public void deactivate(Coord4D coord)
{
for(Frequency freq : frequencies)
{
freq.activeCoords.remove(coord);
}
}
public Frequency validateFrequency(String user, Coord4D coord, Frequency freq)
{
for(Frequency iterFreq : frequencies)
{
if(freq.equals(iterFreq))
{
iterFreq.activeCoords.add(coord);
return iterFreq;
}
}
if(user.equals(freq.owner))
{
freq.activeCoords.add(coord);
frequencies.add(freq);
return freq;
}
return null;
}
public void createOrLoad(World world)
{
if(dataHandler == null)
{
dataHandler = (FrequencyDataHandler)world.perWorldStorage.loadData(FrequencyDataHandler.class, getName());
if(dataHandler == null)
{
dataHandler = new FrequencyDataHandler(getName());
dataHandler.setManager(this);
world.perWorldStorage.setData(getName(), dataHandler);
}
else {
dataHandler.setManager(this);
dataHandler.syncManager();
}
}
}
public Set<Frequency> getFrequencies()
{
return frequencies;
}
public void addFrequency(Frequency freq)
{
frequencies.add(freq);
}
public boolean containsFrequency(Frequency freq)
{
return frequencies.contains(freq);
}
public void writeFrequencies(ArrayList data)
{
data.add(frequencies.size());
for(Frequency freq : frequencies)
{
freq.write(data);
}
}
public Set<Frequency> readFrequencies(ByteBuf dataStream)
{
Set<Frequency> ret = new HashSet<Frequency>();
int size = dataStream.readInt();
try {
for(int i = 0; i < size; i++)
{
Frequency freq = frequencyClass.newInstance();
freq.read(dataStream);
ret.add(freq);
}
} catch(Exception e) {
e.printStackTrace();
}
return ret;
}
public String getName()
{
return owner != null ? owner + "FrequencyHandler" : "FrequencyHandler";
}
public static void reset()
{
for(FrequencyManager manager : managers)
{
manager.frequencies.clear();
manager.dataHandler = null;
}
loaded = false;
}
public static class FrequencyDataHandler extends WorldSavedData
{
public FrequencyManager manager;
public Set<Frequency> loadedFrequencies;
public FrequencyDataHandler(String tagName)
{
super(tagName);
}
public void setManager(FrequencyManager m)
{
manager = m;
}
public void syncManager()
{
if(loadedFrequencies != null)
{
manager.frequencies = loadedFrequencies;
}
}
@Override
public void readFromNBT(NBTTagCompound nbtTags)
{
try {
String frequencyClass = nbtTags.getString("frequencyClass");
if(nbtTags.hasKey("owner"))
{
manager.owner = nbtTags.getString("owner");
}
NBTTagList list = nbtTags.getTagList("invList", NBT.TAG_COMPOUND);
loadedFrequencies = new HashSet<Frequency>();
for(int i = 0; i < list.tagCount(); i++)
{
NBTTagCompound compound = list.getCompoundTagAt(i);
Frequency freq = (Frequency)Class.forName(frequencyClass).newInstance();
freq.read(compound);
loadedFrequencies.add(freq);
}
} catch(Exception e) {
e.printStackTrace();
}
}
@Override
public void writeToNBT(NBTTagCompound nbtTags)
{
nbtTags.setString("frequencyClass", manager.frequencyClass.getName());
if(manager.owner != null)
{
nbtTags.setString("owner", manager.owner);
}
NBTTagList list = new NBTTagList();
for(Frequency freq : manager.getFrequencies())
{
NBTTagCompound compound = new NBTTagCompound();
freq.write(compound);
list.appendTag(compound);
}
nbtTags.setTag("freqList", list);
}
}
}