package mcjty.rftools.blocks.security;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.world.World;
import net.minecraft.world.WorldSavedData;
import net.minecraftforge.common.util.Constants;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class SecurityChannels extends WorldSavedData {
public static final String SECURITY_CHANNELS_NAME = "RFToolsSecurityChannels";
private static SecurityChannels instance = null;
private int lastId = 0;
private final Map<Integer,SecurityChannel> channels = new HashMap<Integer,SecurityChannel>();
public SecurityChannels(String identifier) {
super(identifier);
}
public void save(World world) {
world.mapStorage.setData(SECURITY_CHANNELS_NAME, this);
markDirty();
}
public static void clearInstance() {
if (instance != null) {
instance.channels.clear();
instance = null;
}
}
public static SecurityChannels getChannels() {
return instance;
}
public static SecurityChannels getChannels(World world) {
if (world.isRemote) {
return null;
}
if (instance != null) {
return instance;
}
instance = (SecurityChannels) world.mapStorage.loadData(SecurityChannels.class, SECURITY_CHANNELS_NAME);
if (instance == null) {
instance = new SecurityChannels(SECURITY_CHANNELS_NAME);
}
return instance;
}
public SecurityChannel getOrCreateChannel(int id) {
SecurityChannel channel = channels.get(id);
if (channel == null) {
channel = new SecurityChannel();
channels.put(id, channel);
}
return channel;
}
public SecurityChannel getChannel(int id) {
return channels.get(id);
}
public void deleteChannel(int id) {
channels.remove(id);
}
public int newChannel() {
lastId++;
return lastId;
}
@Override
public void readFromNBT(NBTTagCompound tagCompound) {
channels.clear();
NBTTagList lst = tagCompound.getTagList("channels", Constants.NBT.TAG_COMPOUND);
for (int i = 0 ; i < lst.tagCount() ; i++) {
NBTTagCompound tc = lst.getCompoundTagAt(i);
int channel = tc.getInteger("channel");
SecurityChannel value = new SecurityChannel();
value.setName(tc.getString("name"));
value.setWhitelist(tc.getBoolean("whitelist"));
value.clearPlayers();
NBTTagList playerList = tc.getTagList("players", Constants.NBT.TAG_STRING);
if (playerList != null) {
for (int j = 0 ; j < playerList.tagCount() ; j++) {
String player = playerList.getStringTagAt(j);
value.addPlayer(player);
}
}
channels.put(channel, value);
}
lastId = tagCompound.getInteger("lastId");
}
@Override
public void writeToNBT(NBTTagCompound tagCompound) {
NBTTagList lst = new NBTTagList();
for (Map.Entry<Integer, SecurityChannel> entry : channels.entrySet()) {
NBTTagCompound tc = new NBTTagCompound();
tc.setInteger("channel", entry.getKey());
SecurityChannel channel = entry.getValue();
tc.setString("name", channel.getName());
tc.setBoolean("whitelist", channel.isWhitelist());
NBTTagList playerTagList = new NBTTagList();
for (String player : channel.getPlayers()) {
playerTagList.appendTag(new NBTTagString(player));
}
tc.setTag("players", playerTagList);
lst.appendTag(tc);
}
tagCompound.setTag("channels", lst);
tagCompound.setInteger("lastId", lastId);
}
public static class SecurityChannel {
private String name = "";
private boolean whitelist = true;
private final List<String> players = new ArrayList<String>();
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<String> getPlayers() {
return players;
}
public void addPlayer(String player) {
players.add(player);
}
public void delPlayer(String player) {
players.remove(player);
}
public void clearPlayers() {
players.clear();
}
public boolean isWhitelist() {
return whitelist;
}
public void setWhitelist(boolean whitelist) {
this.whitelist = whitelist;
}
}
}