package joshie.harvest.player.tracking; import joshie.harvest.api.HFApi; import joshie.harvest.api.cooking.Recipe; import joshie.harvest.api.quests.Quest; import joshie.harvest.api.quests.TargetType; import joshie.harvest.core.HFCore; import joshie.harvest.core.helpers.HolderHelper; import joshie.harvest.core.helpers.NBTHelper; import joshie.harvest.core.network.PacketHandler; import joshie.harvest.core.util.holders.ItemStackHolder; import joshie.harvest.knowledge.gui.stats.CollectionHelper; import joshie.harvest.player.PlayerTrackerServer; import joshie.harvest.player.packet.*; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class TrackingServer extends Tracking { private Set<StackSold> toBeShipped = new HashSet<>(); //What needs to be sold private Set<StackSold> shipped = new HashSet<>(); private boolean hasWonCookingContest; private int giftsGiven; public final PlayerTrackerServer master; public TrackingServer(PlayerTrackerServer master) { this.master = master; addDefaultRecipes(); } public void setMineFloorReached(int floor) { if (floor > getMineFloorReached()) { super.setMineFloorReached(floor); PacketHandler.sendToClient(new PacketSyncMineFloor(floor), master.getAndCreatePlayer()); } } public void setHasWonCookingContest() { this.hasWonCookingContest = true; } public Set<StackSold> getShipped() { return shipped; } public void sync(EntityPlayerMP player) { //TODO: Readd in 1.0 as well as adding elevators to the mine on every 5th floor //PacketHandler.sendToClient(new PacketSyncMineFloor(mineFloorReached), player); PacketHandler.sendToClient(new PacketSyncObtainedSet(obtained), player); PacketHandler.sendToClient(new PacketSyncRecipes(recipes), player); PacketHandler.sendToClient(new PacketSyncNotes(notes), player); PacketHandler.sendToClient(new PacketSyncUnread(unread), player); } public void addGift() { giftsGiven++; } @Override public void addAsObtained(ItemStack stack) { obtained.add(ItemStackHolder.of(stack)); PacketHandler.sendToClient(new PacketSyncObtained(stack), master.getAndCreatePlayer()); } public boolean addForShipping(ItemStack item) { long sell = HFApi.shipping.getSellValue(item) * item.stackSize; if (hasWonCookingContest && CollectionHelper.isInCookingCollection(item)) { sell *= 1.1; } StackSold stack = StackSold.of(item, sell); HolderHelper.mergeCollection(stack, toBeShipped); return sell >= 0; } public long newDay() { //Sync the information to the client if (HFCore.DISPLAY_SHIPPED_LIST && toBeShipped.size() > 0) { EntityPlayerMP player = master.getAndCreatePlayer(); if (player != null) { PacketHandler.sendToClient(new PacketRenderSold(toBeShipped), player); } } //Loop through the to ship, get the money and remove them long sold = 0; Iterator<StackSold> forSale = toBeShipped.iterator(); while (forSale.hasNext()) { StackSold stack = forSale.next(); sold += stack.getSellValue(); HolderHelper.mergeCollection(stack, shipped); //Mark this item as having been shipped if (CollectionHelper.isInShippingCollection(stack.getStack())) { addAsObtained(stack.getStack()); //Mark the item as having been collected } forSale.remove(); } return sold; } private void addDefaultRecipes() { //Learn all the default recipes Recipe.REGISTRY.values().stream().filter(recipe -> recipe.isDefault() && !recipes.contains(recipe.getResource())).forEachOrdered(recipe -> recipes.add(recipe.getResource())); } private void addLearntNotes() { for (Quest quest: Quest.REGISTRY) { if (quest.getQuestType() == TargetType.PLAYER) { if (master.getQuests().getFinished().contains(quest)) { quest.getNotes().forEach(this :: learnNote); } } } } public void readFromNBT(NBTTagCompound nbt) { mineFloorReached = nbt.getInteger("Floor"); hasWonCookingContest = nbt.getBoolean("HasWon"); giftsGiven = nbt.getInteger("GiftsGiven"); obtained = NBTHelper.readHashSet(ItemStackHolder.class, nbt.getTagList("ItemsObtained", 10)); toBeShipped = NBTHelper.readHashSet(StackSold.class, nbt.getTagList("ToBeShipped", 10)); recipes = NBTHelper.readResourceSet(nbt, "Recipes"); shipped = NBTHelper.readHashSet(StackSold.class, nbt.getTagList("Shipped", 10)); notes = NBTHelper.readResourceSet(nbt, "Notes"); unread = NBTHelper.readResourceSet(nbt, "Unread"); addDefaultRecipes(); addLearntNotes(); } public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setInteger("Floor", mineFloorReached); nbt.setBoolean("HasWon", hasWonCookingContest); nbt.setInteger("GiftsGiven", giftsGiven); nbt.setTag("ItemsObtained", NBTHelper.writeCollection(obtained)); nbt.setTag("ToBeShipped", NBTHelper.writeCollection(toBeShipped)); nbt.setTag("Recipes", NBTHelper.writeResourceSet(recipes)); nbt.setTag("Shipped", NBTHelper.writeCollection(shipped)); nbt.setTag("Notes", NBTHelper.writeResourceSet(notes)); nbt.setTag("Unread", NBTHelper.writeResourceSet(unread)); return nbt; } }