package joshie.harvest.quests.player.trade;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.calendar.CalendarDate;
import joshie.harvest.api.calendar.Season;
import joshie.harvest.api.npc.NPCEntity;
import joshie.harvest.api.quests.HFQuest;
import joshie.harvest.api.quests.Quest;
import joshie.harvest.calendar.CalendarHelper;
import joshie.harvest.core.helpers.InventoryHelper;
import joshie.harvest.core.helpers.InventoryHelper.SearchType;
import joshie.harvest.crops.HFCrops;
import joshie.harvest.npcs.HFNPCs;
import joshie.harvest.quests.Quests;
import joshie.harvest.quests.base.QuestTrade;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Random;
import java.util.Set;
import static joshie.harvest.api.calendar.Season.*;
import static joshie.harvest.core.helpers.InventoryHelper.SPECIAL;
@HFQuest("trade.seeds")
public class QuestFlowerTrader extends QuestTrade {
private final Random rand = new Random();
private CalendarDate date;
private int received = 3;
@Override
public boolean canStartQuest(Set<Quest> active, Set<Quest> finished) {
return finished.contains(Quests.JADE_MEET) && !finished.contains(Quests.JENNI_MEET);
}
@Override
public boolean isNPCUsed(EntityPlayer player, NPCEntity entity) {
return entity.getNPC() == HFNPCs.FLOWER_GIRL && InventoryHelper.getHandItemIsIn(player, SPECIAL, SearchType.FLOWER, 5) != null;
}
@SideOnly(Side.CLIENT)
@Override
public String getLocalizedScript(EntityPlayer player, NPCEntity entity) {
CalendarDate today = HFApi.calendar.getDate(player.worldObj);
int days = date == null ? 5 : CalendarHelper.getDays(date, today);
if (received > 0 && days >= 5) received = 0;
if (received < 10) {
Season season = HFApi.calendar.getDate(player.worldObj).getSeason();
if (season == SPRING || season == SUMMER || season == AUTUMN) {
//Jade informs the player that she will happily trade flowers
//For a bag of seeds
int chance = player.worldObj.rand.nextInt(3);
return chance == 0 ? getLocalized("complete.yes1"): chance == 1 ? getLocalized("complete.yes2") : getLocalized("complete.yes3");
//Jade Informs the player that she doesn't have in stock this time of year
} else return getLocalized("complete.no");
} else return getLocalized("return", 5 - days);
}
@Override
public void onChatClosed(EntityPlayer player, NPCEntity entity, boolean wasSneaking) {
CalendarDate today = HFApi.calendar.getDate(player.worldObj);
int days = date == null ? 5 : CalendarHelper.getDays(date, today);
if (date != null && received > 0 && days >= 5) {
date = null;
received = 0;
increaseStage(player);
}
for (int i = 0; i < (wasSneaking ? 10: 1); i++) {
if (received < 10) {
if (InventoryHelper.takeItemsIfHeld(player, SPECIAL, SearchType.FLOWER, 5) != null) {
Season season = HFApi.calendar.getDate(player.worldObj).getSeason();
if (season == SPRING || season == SUMMER || season == AUTUMN) {
rand.setSeed(today.hashCode());
if (rand.nextInt(30) == 0) rewardItem(player, HFCrops.TUTORIAL.getSeedStack(1));
else if (season == SPRING) rewardItem(player, HFCrops.TURNIP.getSeedStack(1));
else if (season == SUMMER) rewardItem(player, HFCrops.ONION.getSeedStack(1));
else rewardItem(player, HFCrops.SPINACH.getSeedStack(1));
if (!player.worldObj.isRemote) {
received++; //Increase the amount we've received
if (received >= 10) {
received = 10; //Max it out
date = today.copy(); //Update when we got our last seeds
//Called in order to sync the data
increaseStage(player);
break;
}
//Called in order to sync the data
increaseStage(player);
}
}
}
}
}
//Force complete this, if we've met jenni
if (HFApi.quests.hasCompleted(Quests.JENNI_MEET, player)) {
complete(player);
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
if (nbt.hasKey("Date")) {
date = CalendarDate.fromNBT(nbt.getCompoundTag("Date"));
received = nbt.getByte("Received");
}
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
if (date != null) {
nbt.setTag("Date", date.toNBT());
nbt.setByte("Received", (byte) received);
}
return nbt;
}
}