package joshie.harvest.player; import joshie.harvest.api.calendar.CalendarDate; import joshie.harvest.api.calendar.Season; import joshie.harvest.api.quests.TargetType; import joshie.harvest.calendar.CalendarHelper; import joshie.harvest.core.achievements.HFAchievements; import joshie.harvest.core.helpers.EntityHelper; import joshie.harvest.core.network.PacketHandler; import joshie.harvest.core.util.interfaces.ISyncMaster; import joshie.harvest.knowledge.letter.LetterDataServer; import joshie.harvest.player.relationships.RelationshipDataServer; import joshie.harvest.player.stats.StatsServer; import joshie.harvest.player.tracking.TrackingServer; import joshie.harvest.quests.data.QuestDataServer; import joshie.harvest.quests.packet.PacketSharedSync; import joshie.harvest.town.TownHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import javax.annotation.Nullable; import java.util.UUID; import static joshie.harvest.npcs.gui.ContainerNPCGift.CHRISTMAS; public class PlayerTrackerServer extends PlayerTracker implements ISyncMaster { private final QuestDataServer quests; private final RelationshipDataServer relationships; private final StatsServer stats; private final LetterDataServer letters; protected final TrackingServer tracking; //References to the player and uuid this refers to private EntityPlayerMP player; //No Direct calling, it's a cache value private final UUID uuid; //SHOULD NOT BE CALLED, EXCEPT BY GET AND CREATE PLAYER public PlayerTrackerServer(@Nullable EntityPlayerMP player, UUID uuid) { this.uuid = uuid; this.player = player != null ? player: getAndCreatePlayer(); letters = new LetterDataServer(this); quests = new QuestDataServer(this); relationships = new RelationshipDataServer(this); stats = new StatsServer(this); tracking = new TrackingServer(this); } //Pass the world that this player is currently in @Override public EntityPlayerMP getAndCreatePlayer() { if (player == null) { player = EntityHelper.getPlayerFromUUID(uuid); } return player; } @Override public UUID getUUID() { return uuid; } @Override public RelationshipDataServer getRelationships() { return relationships; } @Override public QuestDataServer getQuests() { return quests; } @Override public StatsServer getStats() { return stats; } @Override public TrackingServer getTracking() { return tracking; } @Override public LetterDataServer getLetters() { return letters; } @Override public TargetType getTargetType() { return TargetType.PLAYER; } @Override public void sync(EntityPlayer other, PacketSharedSync packet) { if (other != null) PacketHandler.sendToClient(packet, other); else { EntityPlayerMP player = getAndCreatePlayer(); if (player != null && player.connection != null && player.connection.netManager != null) { PacketHandler.sendToClient(packet, getAndCreatePlayer()); } } } public void newDay(CalendarDate yesterday, CalendarDate today) { //Add their gold from selling items letters.newDay(today); relationships.newDay(yesterday, today); EntityPlayerMP player = getAndCreatePlayer(); if (player != null) { long gold = tracking.newDay(); if (gold > 0) player.addStat(HFAchievements.firstShipping); stats.addGold(null, gold); if (stats.getGold() >= 1000000) player.addStat(HFAchievements.millionaire); relationships.resetStatus(yesterday, player); //Reset the relationship status stats.syncGold(player); //Resync the players gold if (CalendarHelper.isDateSame(today, CHRISTMAS)) player.addStat(HFAchievements.firstChristmas); if (CalendarHelper.isDateSame(today, stats.getBirthday())) { player.addStat(HFAchievements.birthday); } //Achievements!!!!!!!!!!!!!!!!!!!!!!!!!!!! ? yey?? int yearsPassed = CalendarHelper.getYearsPassed(TownHelper.getClosestTownToEntity(player, false).getBirthday(), today); if (yearsPassed >= 2) { if (today.getSeason() == Season.SPRING) player.addStat(HFAchievements.strawberries); else if (today.getSeason() == Season.SUMMER) player.addStat(HFAchievements.corn); else if (today.getSeason() == Season.AUTUMN) player.addStat(HFAchievements.greenPepper); } else if (yearsPassed >= 1) { if (today.getSeason() == Season.SPRING) player.addStat(HFAchievements.cucumbers); else if (today.getSeason() == Season.SUMMER) player.addStat(HFAchievements.tomatoes); else if (today.getSeason() == Season.AUTUMN) player.addStat(HFAchievements.eggplants); } } } public void syncPlayerStats(EntityPlayerMP player) { //Only sync the stats if the player is online if (player.connection != null && player.connection.netManager != null) { letters.sync(player); quests.sync(player); relationships.sync(player); stats.sync(player); tracking.sync(player); } } public void readFromNBT(NBTTagCompound nbt) { letters.readFromNBT(nbt.getCompoundTag("Letters")); quests.readFromNBT(nbt.getCompoundTag("Quests")); relationships.readFromNBT(nbt.getCompoundTag("Relationships")); stats.readFromNBT(nbt.getCompoundTag("Stats")); tracking.readFromNBT(nbt.getCompoundTag("Tracking")); } public NBTTagCompound writeToNBT(NBTTagCompound nbt) { nbt.setTag("Letters", letters.writeToNBT(new NBTTagCompound())); nbt.setTag("Quests", quests.writeToNBT(new NBTTagCompound())); nbt.setTag("Relationships", relationships.writeToNBT(new NBTTagCompound())); nbt.setTag("Stats", stats.writeToNBT(new NBTTagCompound())); nbt.setTag("Tracking", tracking.writeToNBT(new NBTTagCompound())); return nbt; } }