package joshie.harvest.knowledge.letter; import gnu.trove.iterator.TObjectIntIterator; import gnu.trove.map.TObjectIntMap; import gnu.trove.map.hash.TObjectIntHashMap; import joshie.harvest.api.calendar.CalendarDate; import joshie.harvest.api.core.Letter; import joshie.harvest.core.util.interfaces.ISyncMaster; import joshie.harvest.knowledge.packet.PacketAddLetter; import joshie.harvest.knowledge.packet.PacketRemoveLetter; import joshie.harvest.knowledge.packet.PacketSyncLetters; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; import java.util.Set; public class LetterDataServer extends LetterData { protected final TObjectIntMap<Letter> letters = new TObjectIntHashMap<>(); //Letters Unread with the number of days left private final ISyncMaster master; public LetterDataServer(ISyncMaster master) { this.master = master; } @Override public Set<Letter> getLetters() { return letters.keySet(); } @Override public boolean hasUnreadLetters() { return !(letters.size() == 1 && letters.containsKey(Letter.NONE)) && letters.size() > 0; } public void add(Letter letter) { if (letter != Letter.NONE) { letters.put(letter, 0); } } public void remove(Letter letter) { letters.remove(letter); } void addLetterAndSync(Letter letter) { add(letter); //Call add letter code master.sync(null, new PacketAddLetter(letter)); } void removeLetterAndSync(Letter letter) { remove(letter); //Call remove letter code master.sync(null, new PacketRemoveLetter(letter)); } public void sync(EntityPlayerMP player) { master.sync(player, new PacketSyncLetters(letters.keySet())); } public void newDay(CalendarDate today) { //Increase the number of days passed by one letters.keySet().forEach(letters::increment); //Now to check if we need to remove, then remove if so boolean changed = false; TObjectIntIterator<Letter> it = letters.iterator(); while (it.hasNext()) { it.advance(); //Advance the iterator Letter letter = it.key(); if (letter.isExpired(today, it.value())) { changed = true; it.remove(); } } if (changed) { master.sync(null, new PacketSyncLetters(letters.keySet())); } } public void readFromNBT(NBTTagCompound nbt) { NBTTagList list = nbt.getTagList("LetterData", 10); for (int i = 0; i < list.tagCount(); i++) { NBTTagCompound tag = list.getCompoundTagAt(i); ResourceLocation resource = new ResourceLocation(tag.getString("Letter")); int days = tag.getInteger("Days"); Letter letter = Letter.REGISTRY.get(resource); if (letter != Letter.NONE) { letters.put(letter, days); } } } public NBTTagCompound writeToNBT(NBTTagCompound nbt) { NBTTagList list = new NBTTagList(); for (Letter letter: letters.keySet()) { NBTTagCompound tag = new NBTTagCompound(); tag.setString("Letter", letter.getResource().toString()); tag.setInteger("Days", letters.get(letter)); list.appendTag(tag); } nbt.setTag("LetterData", list); return nbt; } }