package joshie.harvest.quests.player.trade;
import joshie.harvest.api.HFApi;
import joshie.harvest.api.calendar.CalendarDate;
import joshie.harvest.api.core.ITiered.ToolTier;
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.HFTrackers;
import joshie.harvest.core.base.item.ItemTool;
import joshie.harvest.core.lib.HFSounds;
import joshie.harvest.npcs.HFNPCs;
import joshie.harvest.quests.Quests;
import joshie.harvest.quests.base.QuestTrade;
import net.minecraft.entity.EntityLiving;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.SoundCategory;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;
import java.util.Set;
import static joshie.harvest.api.core.ITiered.ToolTier.CURSED;
import static joshie.harvest.core.helpers.SpawnItemHelper.spawnXP;
import static joshie.harvest.quests.Quests.TOMAS_MEET;
@HFQuest("trade.cursed")
public class QuestBlessing extends QuestTrade {
private static final int TEST = 0;
private CalendarDate date;
private ItemStack tool;
@Override
public boolean canStartQuest(Set<Quest> active, Set<Quest> finished) {
return finished.contains(TOMAS_MEET);
}
@Override
public boolean isNPCUsed(EntityPlayer player, NPCEntity entity) {
return entity.getNPC() == HFNPCs.PRIEST && (isHolding(player) || tool != null);
}
@SideOnly(Side.CLIENT)
@Override
public String getLocalizedScript(EntityPlayer player, NPCEntity entity) {
if (quest_stage == TEST) {
long cost = HFApi.quests.hasCompleted(Quests.TOMAS_15K, player) ? 25000 : 50000;
boolean hasGold = HFTrackers.getPlayerTrackerFromPlayer(player).getStats().getGold() >= cost;
boolean hasTool = isHolding(player);
if (hasGold && hasTool) {
return getLocalized("accept");
} else if (hasTool) {
return getLocalized("gold", cost);
} else return player.worldObj.rand.nextDouble() <= 0.05D ? getLocalized("reminder", cost) : null;
} else {
CalendarDate today = HFApi.calendar.getDate(player.worldObj);
if (CalendarHelper.getDays(date, today) >= 3) {
return getLocalized("done", tool.getDisplayName());
}
return getLocalized("wait", 3 - (CalendarHelper.getDays(date, today)));
}
}
@Override
@SuppressWarnings("ConstantConditions")
public void onChatClosed(EntityPlayer player, NPCEntity npc, boolean isSneaking) {
if (quest_stage == TEST) {
long cost = HFApi.quests.hasCompleted(Quests.TOMAS_15K, player) ? 25000 : 50000;
boolean hasGold = HFTrackers.getPlayerTrackerFromPlayer(player).getStats().getGold() >= cost;
boolean hasTool = isHolding(player);
if (hasGold && hasTool) {
increaseStage(player);
date = HFApi.calendar.getDate(player.worldObj).copy();
ItemStack stack = player.getHeldItemMainhand().copy();
tool = new ItemStack(stack.getItem(), 1, stack.getItemDamage() + 1);
tool.setTagCompound(stack.getTagCompound().copy());
rewardGold(player, -cost);
takeHeldStack(player, 1);
}
} else {
CalendarDate today = HFApi.calendar.getDate(player.worldObj);
if (CalendarHelper.getDays(date, today) >= 3) {
complete(player);
player.worldObj.playSound(player, player.posX, player.posY, player.posZ, HFSounds.BLESS_TOOL, SoundCategory.NEUTRAL, 0.25F, 1F);
EntityLiving entity = npc.getAsEntity();
for (int i = 0; i < 32; i++) {
player.worldObj.spawnParticle(EnumParticleTypes.VILLAGER_HAPPY, entity.posX + player.worldObj.rand.nextFloat() + player.worldObj.rand.nextFloat() - 1F, entity.posY + 0.25D + entity.worldObj.rand.nextFloat() + entity.worldObj.rand.nextFloat(), entity.posZ + player.worldObj.rand.nextFloat() + player.worldObj.rand.nextFloat() - 1F, 0, 0, 0);
}
}
}
}
@Override
public void onQuestCompleted(EntityPlayer player) {
rewardItem(player, tool);
HFTrackers.getPlayerTrackerFromPlayer(player).getTracking().addAsObtained(tool);
spawnXP(player.worldObj, (int)player.posX, (int)player.posY, (int)player.posZ, 5);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
if (nbt.hasKey("Date")) {
date = CalendarDate.fromNBT(nbt.getCompoundTag("Date"));
tool = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("Item"));
}
}
/** Called to write data about this quest
* @param nbt the nbt tag to write to
* @return the nbt tag**/
public NBTTagCompound writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
if (date != null) {
nbt.setTag("Date", date.toNBT());
nbt.setTag("Item", tool.writeToNBT(new NBTTagCompound()));
}
return nbt;
}
private boolean isHolding(EntityPlayer player) {
ItemStack held = player.getHeldItemMainhand();
if (held != null) {
if (held.getItem() instanceof ItemTool) {
ItemTool tool = ((ItemTool)held.getItem());
ToolTier tier = tool.getTier(held);
return tier == CURSED;
}
}
return false;
}
}