package joshie.harvest.quests;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.quests.IQuestHelper;
import joshie.harvest.api.quests.Quest;
import joshie.harvest.api.quests.TargetType;
import joshie.harvest.core.HFTrackers;
import joshie.harvest.core.helpers.SpawnItemHelper;
import joshie.harvest.core.util.annotations.HFApiImplementation;
import joshie.harvest.npcs.entity.EntityNPC;
import joshie.harvest.player.PlayerTrackerServer;
import joshie.harvest.quests.packet.PacketSyncData;
import joshie.harvest.town.TownHelper;
import joshie.harvest.town.data.TownDataServer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.FakePlayer;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static joshie.harvest.core.lib.HFModInfo.MODID;
import static joshie.harvest.core.network.PacketHandler.sendToClient;
import static joshie.harvest.core.network.PacketHandler.sendToDimension;
@HFApiImplementation
public class QuestHelper implements IQuestHelper {
public static final QuestHelper INSTANCE = new QuestHelper();
private QuestHelper() {}
@Override
public void completeQuestConditionally(Quest quest, EntityPlayer player) {
if (!hasCompleted(quest, player)) {
if (quest.getQuestType() == TargetType.PLAYER) HFTrackers.getPlayerTrackerFromPlayer(player).getQuests().markCompleted(player.worldObj, player, quest, false);
else TownHelper.getClosestTownToEntity(player, false).getQuests().markCompleted(player.worldObj, player, quest, false);
}
}
@Override
public void completeQuest(Quest quest, EntityPlayer player) {
if (!player.worldObj.isRemote) {
if (quest.getQuestType() == TargetType.PLAYER) HFTrackers.getPlayerTrackerFromPlayer(player).getQuests().markCompleted(player.worldObj, player, quest, true);
else TownHelper.getClosestTownToEntity(player, false).getQuests().markCompleted(player.worldObj, player, quest, true);
}
}
@Override
public boolean hasCompleted(Quest quest, EntityPlayer player) {
if (quest == null) return false;
if (quest.getQuestType() == TargetType.PLAYER) return HFTrackers.getPlayerTrackerFromPlayer(player).getQuests().getFinished().contains(quest);
return TownHelper.getClosestTownToEntity(player, false).getQuests().getFinished().contains(quest);
}
@Override
public void increaseStage(Quest quest, EntityPlayer player) {
if (!player.worldObj.isRemote) {
quest.setStage(quest.getStage() + 1);
if (quest.getQuestType() == TargetType.PLAYER) sendToClient(new PacketSyncData(quest, quest.writeToNBT(new NBTTagCompound())), player);
else {
TownDataServer data = TownHelper.getClosestTownToEntity(player, false);
sendToDimension(player.worldObj.provider.getDimension(), new PacketSyncData(quest, quest.writeToNBT(new NBTTagCompound())).setUUID(data.getID()));
HFTrackers.markTownsDirty();
}
}
}
@Override
public void syncData(Quest quest, EntityPlayer player) {
if (!player.worldObj.isRemote) {
if (quest.getQuestType() == TargetType.PLAYER) sendToClient(new PacketSyncData(quest, quest.writeToNBT(new NBTTagCompound())), player);
else {
TownDataServer data = TownHelper.getClosestTownToEntity(player, false);
sendToDimension(player.worldObj.provider.getDimension(), new PacketSyncData(quest, quest.writeToNBT(new NBTTagCompound())).setUUID(data.getID()));
HFTrackers.markTownsDirty();
}
}
}
/**************************
* REWARDS
*****************************/
@Override
public void rewardItem(Quest quest, EntityPlayer player, ItemStack stack) {
SpawnItemHelper.addToPlayerInventory(player, stack);
}
@Override
public void rewardGold(EntityPlayer player, long amount) {
if (!player.worldObj.isRemote) {
HFTrackers.<PlayerTrackerServer>getPlayerTrackerFromPlayer(player).getStats().addGold((EntityPlayerMP) player, amount);
}
}
@Override
public void rewardEntity(Quest quest, EntityPlayer player, String entity) {
if (!player.worldObj.isRemote) {
Entity theEntity = EntityList.createEntityByIDFromName(entity, player.worldObj);
if (theEntity != null) {
theEntity.setPosition(player.posX, player.posY, player.posZ);
player.worldObj.spawnEntityInWorld(theEntity);
}
}
}
private static final List<Quest> EMPTY = new ArrayList<>();
private boolean isFakePlayer(EntityPlayer player) {
return player instanceof FakePlayer;
}
@Override
public List<Quest> getCurrentQuests(@Nonnull EntityPlayer player) {
if (isFakePlayer(player)) return EMPTY;
List<Quest> all = new ArrayList<>();
all.addAll(HFTrackers.getPlayerTrackerFromPlayer(player).getQuests().getCurrent());
all.addAll(TownHelper.getClosestTownToEntity(player, false).getQuests().getCurrent());
Collections.sort(all, ((o1, o2) -> o1.getRegistryName().toString().compareTo(o2.getRegistryName().toString())));
Collections.sort(all, ((o1, o2) -> o1.getPriority().compareTo(o2.getPriority())));
return all;
}
public static Quest getQuest(String name) {
try {
return Quest.REGISTRY.getValue(new ResourceLocation(MODID, name));
} catch (Exception e) { return null; }
}
@Nullable
public static Quest getCurrentQuest(EntityPlayer player, EntityNPC npc) {
List<Quest> quests = HFApi.quests.getCurrentQuests(player);
for (Quest quest: quests) {
if (quest.isNPCUsed(player, npc)) return quest;
}
return null;
}
public static Quest getSelectiomFromID(EntityPlayer player, int selection) {
Quest toFetch = Quest.REGISTRY.getValues().get(selection);
if (toFetch.getQuestType() == TargetType.PLAYER) return HFTrackers.getPlayerTrackerFromPlayer(player).getQuests().getAQuest(toFetch);
else return TownHelper.getClosestTownToEntity(player, false).getQuests().getAQuest(toFetch);
}
}