package joshie.harvest.quests.town.seeds; import joshie.harvest.api.HFApi; import joshie.harvest.api.calendar.CalendarDate; import joshie.harvest.api.calendar.Season; import joshie.harvest.api.crops.Crop; import joshie.harvest.api.npc.NPC; import joshie.harvest.api.npc.NPCEntity; import joshie.harvest.api.quests.Quest; import joshie.harvest.core.HFTrackers; import joshie.harvest.player.PlayerTrackerServer; import joshie.harvest.player.tracking.StackSold; import joshie.harvest.quests.base.QuestTown; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.stats.Achievement; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import javax.annotation.Nullable; import java.util.HashSet; import java.util.Set; public class QuestShipping extends QuestTown { private static final int START = 0; private static final int FINISHED = 1; private static final int FINISHED2 = 2; private CalendarDate lastCheck; private Set<StackSold> crops; private Season season; private Achievement achievement; private int required; private int total; QuestShipping(Achievement achievement, NPC npc, Season season, int required) { this.setNPCs(npc); this.achievement = achievement; this.season = season; this.required = required; } @Override public boolean canStartQuest(Set<Quest> active, Set<Quest> finished) { return true; } //Rebuild the list of spring crops private void rebuildCropSet() { crops = new HashSet<>(); for (Crop crop: Crop.REGISTRY.values()) { for (Season season: crop.getSeasons()) { if (season == this.season) { crops.add(StackSold.of(crop.getCropStack(1), 0L)); break; } } } } private int getTotalCrops(CalendarDate date, EntityPlayer player) { if (lastCheck != null && date.equals(lastCheck)) return total; else { total = 0; lastCheck = date.copy(); for (StackSold sold : HFTrackers.<PlayerTrackerServer>getPlayerTrackerFromPlayer(player).getTracking().getShipped()) { for (StackSold spring : crops) { if (sold.equals(spring)) { total += sold.getAmount(); break; } } } return total; } } @Override public boolean isNPCUsed(EntityPlayer player, NPCEntity entity) { if (!super.isNPCUsed(player, entity)) return false; boolean ret = quest_stage >= FINISHED; if (quest_stage == START && HFApi.calendar.getDate(player.worldObj).getSeason() == season) { if (!player.worldObj.isRemote) { if (crops == null) rebuildCropSet(); int totalCrops = getTotalCrops(HFApi.calendar.getDate(player.worldObj), player); if (totalCrops >= required) { player.addStat(achievement); increaseStage(player); } } return false; } return ret; } @Nullable @SideOnly(Side.CLIENT) public String getLocalizedScript(EntityPlayer player, NPCEntity entity) { return quest_stage == FINISHED2 ? getLocalized("complete") : null; } @Override public void onChatClosed(EntityPlayer player, NPCEntity entity, boolean wasSneaking) { if (quest_stage == FINISHED2) complete(player); else if (quest_stage == FINISHED) increaseStage(player); } }