package joshie.harvest.quests.data;
import joshie.harvest.api.quests.Quest;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.*;
public abstract class QuestData {
protected final Set<Quest> current = new HashSet<>();
protected final Set<Quest> finished = new HashSet<>();
public Set<Quest> getCurrent() {
return current;
}
public Set<Quest> getFinished() {
return finished;
}
@SuppressWarnings("unchecked")
public <Q extends Quest> Q getAQuest(Quest quest) {
//Create the quest if it doesn't exist
if (!quest.isRealQuest() && !current.contains(quest)) {
startQuest(quest, false, null);
}
//Search the quests for the real version
for (Quest q : current) {
if (q.equals(quest)) {
return (Q) q;
}
}
return null;
}
public abstract void markCompleted(@Nonnull World world, @Nullable EntityPlayer player, Quest quest, boolean rewards);
public boolean startQuest(Quest quest, boolean sync, @Nullable NBTTagCompound tag) { return false; }
public abstract void removeAsCurrent(@Nonnull World world, Quest quest);
public void readFromNBT(NBTTagCompound nbt) {
if (nbt.hasKey("CurrentQuests")) {
NBTTagList list = nbt.getTagList("CurrentQuests", 10);
for (int i = 0; i < list.tagCount(); i++) {
NBTTagCompound tag = list.getCompoundTagAt(i);
Quest q = Quest.REGISTRY.getValue(new ResourceLocation(tag.getString("QuestID")));
if (q != null) {
try {
Quest quest = q.getClass().newInstance().setRegistryName(q.getRegistryName());
quest.readFromNBT(tag);
quest.onQuestActivated();
current.add(quest);
} catch (InstantiationException | IllegalAccessException e) { /**/}
}
}
}
if (nbt.hasKey("FinishedQuests")) {
NBTTagList list = nbt.getTagList("FinishedQuests", 8);
for (int i = 0; i < list.tagCount(); i++) {
finished.add(Quest.REGISTRY.getValue(new ResourceLocation((list.getStringTagAt(i)))));
}
}
}
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
NBTTagList quests = new NBTTagList();
for (Quest s : current) {
NBTTagCompound tag = new NBTTagCompound();
tag.setString("QuestID", s.getRegistryName().toString());
s.writeToNBT(tag);
quests.appendTag(tag);
}
nbt.setTag("CurrentQuests", quests);
NBTTagList done = new NBTTagList();
finished.stream().filter(s -> s != null).forEachOrdered(s -> done.appendTag(new NBTTagString(s.getRegistryName().toString())));
nbt.setTag("FinishedQuests", done);
return nbt;
}
}