diff --git a/src/main/java/noppes/npcs/NoppesUtilPlayer.java b/src/main/java/noppes/npcs/NoppesUtilPlayer.java index ccfb63d90..e90caab3b 100644 --- a/src/main/java/noppes/npcs/NoppesUtilPlayer.java +++ b/src/main/java/noppes/npcs/NoppesUtilPlayer.java @@ -320,14 +320,32 @@ public class NoppesUtilPlayer { } } + public static void updatePartyQuestLogData(ByteBuf buffer, EntityPlayerMP player) throws IOException { + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + String trackedQuestString = Server.readString(buffer); + Quest trackedQuest = getQuestFromStringKey(trackedQuestString); + if (trackedQuest != null) { + playerData.questData.trackParty(playerData.getPlayerParty()); + } else { + playerData.questData.untrackQuest(); + } + } + private static Quest getQuestFromStringKey(String string) { if (string != null && string.contains(":")) { String[] splitString = string.split(":"); - if(splitString.length < 2){ - return null; - } - String categoryName = splitString[0]; - String questName = splitString[1]; + + String categoryName; + String questName; + if (splitString.length == 3 && splitString[0].equals("P")) { + categoryName = splitString[1]; + questName = splitString[2]; + } else if (splitString.length < 2) { + return null; + } else { + categoryName = splitString[0]; + questName = splitString[1]; + } for (QuestCategory category : QuestController.Instance.categories.values()) { if (category.title.equals(categoryName)) { @@ -364,6 +382,30 @@ public class NoppesUtilPlayer { } } + public static void sendPartyTrackedQuestData(EntityPlayerMP player, Party party) { + Quest trackedQuest = (Quest) PlayerDataController.Instance.getPlayerData(player).questData.getTrackedQuest(); + if(trackedQuest != null){ + NBTTagCompound compound = new NBTTagCompound(); + compound.setTag("Quest",trackedQuest.writeToNBT(new NBTTagCompound())); + compound.setString("CategoryName", trackedQuest.getCategory().getName()); + if(trackedQuest.completion == EnumQuestCompletion.Instant){ + compound.setBoolean("Instant", true); + } + else { + compound.setString("TurnInNPC", trackedQuest.getNpcName()); + } + NBTTagList nbtTagList = new NBTTagList(); + for (IQuestObjective objective : trackedQuest.questInterface.getPartyObjectives(party)) { + nbtTagList.appendTag(new NBTTagString(objective.getText())); + if(objective.getAdditionalText() != null) + nbtTagList.appendTag(new NBTTagString(objective.getAdditionalText())); + } + compound.setTag("ObjectiveList",nbtTagList); + + Server.sendData(player, EnumPacketClient.OVERLAY_QUEST_TRACKING, compound); + } + } + public static void sendQuestLogData(EntityPlayerMP player) { if(!PlayerQuestController.hasActiveQuests(player)){ return; @@ -372,6 +414,13 @@ public class NoppesUtilPlayer { data.setData(player); Server.sendData(player, EnumPacketClient.GUI_DATA, data.writeNBT()); } + + public static void sendTrackedQuest(EntityPlayerMP player) { + QuestLogData data = new QuestLogData(); + data.setTrackedQuestKey(player); + Server.sendData(player, EnumPacketClient.PARTY_DATA, data.writeTrackedQuest()); + } + public static boolean questCompletion(EntityPlayerMP player, int questId) { if(player == null) return false; @@ -477,6 +526,7 @@ public class NoppesUtilPlayer { if (partyEv.isCancelled()) return false; + boolean hasNextQuest = data.quest.hasNewQuest(); PartyOptions partyOptions = quest.partyOptions; EnumPartyExchange complete = partyOptions.completeFor; EnumPartyExchange reward = partyOptions.rewardControl; @@ -565,11 +615,13 @@ public class NoppesUtilPlayer { if(meetsComplete){ PlayerQuestController.setQuestPartyFinished(data.quest, player, data); - if (data.quest.hasNewQuest()) { + } + + if (hasNextQuest) { + if(meetsComplete){ QuestData nextQuest = new QuestData(data.quest.getNextQuest()); nextQuest.sendAlerts = data.quest.id != data.quest.getNextQuest().id || data.sendAlerts; PlayerQuestController.addActiveQuest(nextQuest, player); - // questData.trackQuest(nextQuest.quest); } } @@ -579,8 +631,30 @@ public class NoppesUtilPlayer { } } - if(data.quest.completion == EnumQuestCompletion.Npc){ + + if (hasNextQuest) { + if(party.validateQuest(data.quest.getNextQuest().getId(), true)){ + party.setQuest(data.quest.getNextQuest()); + for(String name : party.getPlayerNames()) { + EntityPlayer player = NoppesUtilServer.getPlayerByName(name); + if (player == null) + continue; + + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + if (playerData == null) + continue; + + playerData.questData.trackParty(party); + } + } + else { + party.setQuest(null); + } + } else { party.setQuest(null); + } + + if(data.quest.completion == EnumQuestCompletion.Npc){ PartyController.Instance().sendQuestChat(party, "party.completeChat"); PartyController.Instance().pingPartyUpdate(party); } diff --git a/src/main/java/noppes/npcs/PacketHandlerPlayer.java b/src/main/java/noppes/npcs/PacketHandlerPlayer.java index 12b31f03c..55feeae1f 100644 --- a/src/main/java/noppes/npcs/PacketHandlerPlayer.java +++ b/src/main/java/noppes/npcs/PacketHandlerPlayer.java @@ -209,6 +209,9 @@ public class PacketHandlerPlayer{ else if(type == EnumPlayerPacket.QuestLog){ NoppesUtilPlayer.sendQuestLogData(player); } + else if(type == EnumPlayerPacket.TrackedQuest){ + NoppesUtilPlayer.sendTrackedQuest(player); + } else if(type == EnumPlayerPacket.FactionsGet){ PlayerFactionData data = PlayerDataController.Instance.getPlayerData(player).factionData; Server.sendData(player, EnumPacketClient.GUI_DATA, data.getPlayerGuiData()); diff --git a/src/main/java/noppes/npcs/PacketHandlerServer.java b/src/main/java/noppes/npcs/PacketHandlerServer.java index 41e3a2a45..6a3fb0858 100644 --- a/src/main/java/noppes/npcs/PacketHandlerServer.java +++ b/src/main/java/noppes/npcs/PacketHandlerServer.java @@ -91,7 +91,10 @@ public class PacketHandlerServer{ } else if (type == EnumPacketServer.QuestLogToServer) { NoppesUtilPlayer.updateQuestLogData(buffer, player); return; - } else if(type == EnumPacketServer.DimensionsGet){ + } else if (type == EnumPacketServer.PartyLogToServer) { + NoppesUtilPlayer.updatePartyQuestLogData(buffer, player); + return; + } else if(type == EnumPacketServer.DimensionsGet){ HashMap map = new HashMap(); for(int id : DimensionManager.getStaticDimensionIDs()){ WorldProvider provider = DimensionManager.createProviderFor(id); @@ -317,6 +320,7 @@ public class PacketHandlerServer{ NBTTagCompound compound = party.writeToNBT(); if (party.getQuest() != null) { Quest quest = (Quest) party.getQuest(); + compound.setString("QuestName", quest.getCategory().getName() + ":" + quest.getName()); Vector vector = quest.questInterface.getPartyQuestLogStatus(party); NBTTagList list = new NBTTagList(); for (String s : vector) { diff --git a/src/main/java/noppes/npcs/QuestLogData.java b/src/main/java/noppes/npcs/QuestLogData.java index 608224faf..e70cfde6a 100644 --- a/src/main/java/noppes/npcs/QuestLogData.java +++ b/src/main/java/noppes/npcs/QuestLogData.java @@ -2,9 +2,11 @@ package noppes.npcs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.api.handler.data.IQuest; import noppes.npcs.constants.EnumQuestCompletion; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.PlayerQuestController; +import noppes.npcs.controllers.data.Party; import noppes.npcs.controllers.data.PlayerData; import noppes.npcs.controllers.data.Quest; @@ -47,6 +49,17 @@ public class QuestLogData { partyQuests = NBTTags.getStringIntegerMap(compound.getTagList("PartyQuests", 10)); partyOptions = NBTTags.getVectorMap(compound.getTagList("PartyOptions", 10)); } + + public NBTTagCompound writeTrackedQuest(){ + NBTTagCompound compound = new NBTTagCompound(); + compound.setString("TrackedQuestID", trackedQuestKey); + return compound; + } + + public void readTrackedQuest(NBTTagCompound compound){ + trackedQuestKey = compound.getString("TrackedQuestID"); + } + public void setData(EntityPlayer player){ PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); @@ -76,8 +89,36 @@ public class QuestLogData { partyOptions.put(key, quest.partyOptions.getPartyOptionsList()); } } + + Party party = playerData.getPlayerParty(); + if(party != null && party.getQuest() != null){ + if (playerData.questData.getTrackedQuest() != null) { + if (party.getQuest().getId() == playerData.questData.getTrackedQuest().getId()) { + trackedQuestKey = "P" + ":" + party.getQuest().getCategory().getName() + ":" + party.getQuest().getName(); + } + } + } } + public void setTrackedQuestKey(EntityPlayer player){ + PlayerData playerData = PlayerDataController.Instance.getPlayerData(player); + + Party party = playerData.getPlayerParty(); + if(party != null && party.getQuest() != null){ + if (playerData.questData.getTrackedQuest() != null) { + if (party.getQuest().getId() == playerData.questData.getTrackedQuest().getId()) { + trackedQuestKey = "P" + ":" + party.getQuest().getCategory().getName() + ":" + party.getQuest().getName(); + } + } + } else if(playerData.questData != null && playerData.questData.getTrackedQuest() != null){ + IQuest quest = playerData.questData.getTrackedQuest(); + trackedQuestKey = quest.getCategory().getName() + ":" + quest.getName(); + } + else { + trackedQuestKey = ""; + } + } + public boolean hasSelectedQuest() { return !selectedQuest.isEmpty(); } diff --git a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java index 4958589aa..2632c3e97 100644 --- a/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java +++ b/src/main/java/noppes/npcs/ScriptPlayerEventHandler.java @@ -30,10 +30,7 @@ import noppes.npcs.constants.EnumQuestType; import noppes.npcs.constants.SyncType; import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.ScriptController; -import noppes.npcs.controllers.data.PlayerData; -import noppes.npcs.controllers.data.PlayerDataScript; -import noppes.npcs.controllers.data.PlayerQuestData; -import noppes.npcs.controllers.data.Quest; +import noppes.npcs.controllers.data.*; import noppes.npcs.entity.EntityNPCInterface; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.item.ScriptCustomItem; @@ -78,7 +75,10 @@ public class ScriptPlayerEventHandler { playerData.timers.update(); } - if (playerData.questData.getTrackedQuest() != null && !playerData.questData.activeQuests.containsKey(playerData.questData.getTrackedQuest().getId())) { + + Party party = playerData.getPlayerParty(); + boolean trackingPartyQuest = playerData.questData.getTrackedQuest() != null && party != null && party.getQuest() != null && party.getQuest().getId() == playerData.questData.getTrackedQuest().getId(); + if (playerData.questData.getTrackedQuest() != null && !playerData.questData.activeQuests.containsKey(playerData.questData.getTrackedQuest().getId()) && !trackingPartyQuest) { PlayerDataController.Instance.getPlayerData(player).questData.untrackQuest(); } @@ -90,7 +90,12 @@ public class ScriptPlayerEventHandler { PlayerQuestData questData = playerData.questData; if(questData != null){ if (questData.getTrackedQuest() != null && ((Quest) questData.getTrackedQuest()).type == EnumQuestType.Item) { - NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player); + if(trackingPartyQuest){ + NoppesUtilPlayer.sendPartyTrackedQuestData((EntityPlayerMP) event.player, party); + } + else { + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player); + } } } } @@ -483,9 +488,16 @@ public class ScriptPlayerEventHandler { IPlayer scriptPlayer = (IPlayer) NpcAPI.Instance().getIEntity(event.player); EventHooks.onPlayerLogin(handler, scriptPlayer); - Quest quest = (Quest) PlayerDataController.Instance.getPlayerData(event.player).questData.getTrackedQuest(); + PlayerData playerData = PlayerDataController.Instance.getPlayerData(event.player); + Quest quest = (Quest) playerData.questData.getTrackedQuest(); if (quest != null) { - NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player); + Party party = playerData.getPlayerParty(); + if(party != null && party.getQuest() != null && party.getQuest().getId() == quest.getId()){ + NoppesUtilPlayer.sendPartyTrackedQuestData((EntityPlayerMP) event.player, party); + } + else { + NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) event.player); + } } PlayerDataController.Instance.getPlayerData(event.player).skinOverlays.updateClient(); diff --git a/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java b/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java index ad1bab63c..87f46d1ee 100644 --- a/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java +++ b/src/main/java/noppes/npcs/client/gui/OverlayQuestTracking.java @@ -122,6 +122,9 @@ public class OverlayQuestTracking extends Gui { boolean completed = false; try { + if(split.length < 2) + throw new NumberFormatException("catch"); + int killed = Integer.parseInt(split[0].trim()); int total = Integer.parseInt(split[1].trim()); diff --git a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java index 737a3d227..c4cbf721c 100644 --- a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java +++ b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiParty.java @@ -1,6 +1,5 @@ package noppes.npcs.client.gui.player.inventory; -import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNoCallback; @@ -9,12 +8,14 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; +import noppes.npcs.NoppesUtilPlayer; +import noppes.npcs.QuestLogData; import noppes.npcs.client.Client; import noppes.npcs.client.ClientCacheHandler; import noppes.npcs.client.CustomNpcResourceListener; -import noppes.npcs.client.TextBlockClient; import noppes.npcs.client.gui.util.*; import noppes.npcs.constants.EnumPacketServer; +import noppes.npcs.constants.EnumPlayerPacket; import noppes.npcs.controllers.data.Party; import noppes.npcs.controllers.data.Quest; import org.lwjgl.opengl.GL11; @@ -40,6 +41,9 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu private boolean showQuestText; private final Vector questLogStatus = new Vector<>(); private String questCompleteWith; + private String trackedQuestKey; + private String originalTracked = ""; + private QuestLogData data = new QuestLogData(); public GuiParty() { super(); @@ -47,6 +51,7 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu xSize = 280; ySize = 180; drawDefaultBackground = false; + NoppesUtilPlayer.sendData(EnumPlayerPacket.TrackedQuest); Client.sendData(EnumPacketServer.GetPartyData); } @@ -169,10 +174,12 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu } if (party.getIsLocked()){ - GuiNpcButton trackButton = new GuiNpcButton(340, guiLeft + 5, guiTop + ySize - 8 - 23, "party.track"); + GuiNpcButton trackButton = new GuiNpcButton(415, guiLeft + 5, guiTop + ySize - 8 - 23, new String[]{"party.track", "quest.tracking"}, data.trackedQuestKey.equals("P" + ":" + trackedQuestKey) ? 1 : 0); trackButton.width = 135; this.addButton(trackButton); - getButton(340).enabled = false; + if (trackButton.enabled && trackButton.getValue() == 1) { + trackButton.packedFGColour = 0x32CD32; + } } } } @@ -281,10 +288,17 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu break; case 410: if (this.isLeader) { - GuiYesNo yesnoDisband = new GuiYesNo(this, "Confirm", StatCollector.translateToLocal("party.disbandConfirm"), 4); + GuiYesNo yesnoDisband = new GuiYesNo(this, "Confirm", StatCollector.translateToLocal("party.dropQuestConfirm"), 4); displayGuiScreen(yesnoDisband); } break; + case 415: + if (!data.trackedQuestKey.equals("P" + ":" + trackedQuestKey)) { + data.trackedQuestKey = "P" + ":" + trackedQuestKey; + } else { + data.trackedQuestKey = ""; + } + break; } initGui(); } @@ -368,9 +382,15 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu @Override public void setPartyData(NBTTagCompound compound) { this.receivedData = true; + if (compound.hasKey("TrackedQuestID")) { + this.originalTracked = compound.getString("TrackedQuestID"); + data.trackedQuestKey = this.originalTracked; + } + if (compound.hasKey("QuestPing")) { this.questLogStatus.clear(); this.questCompleteWith = ""; + this.trackedQuestKey = ""; if (compound.hasKey("QuestProgress")) { NBTTagList tagList = compound.getTagList("QuestProgress", 8); for (int i = 0; i < tagList.tagCount(); i++) { @@ -380,10 +400,14 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu if (compound.hasKey("QuestCompleteWith")) { this.questCompleteWith = compound.getString("QuestCompleteWith"); } + if (compound.hasKey("QuestName")) { + this.trackedQuestKey = compound.getString("QuestName"); + } } else { ClientCacheHandler.party = null; } + if (compound.hasKey("PartyUUID")) { UUID uuid = UUID.fromString(compound.getString("PartyUUID")); ClientCacheHandler.party = new Party(uuid); @@ -391,6 +415,7 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu party.readFromNBT(compound); this.questLogStatus.clear(); this.questCompleteWith = ""; + this.trackedQuestKey = ""; if (compound.hasKey("QuestProgress")) { NBTTagList tagList = compound.getTagList("QuestProgress", 8); for (int i = 0; i < tagList.tagCount(); i++) { @@ -400,7 +425,11 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu if (compound.hasKey("QuestCompleteWith")) { this.questCompleteWith = compound.getString("QuestCompleteWith"); } + if (compound.hasKey("QuestName")) { + this.trackedQuestKey = compound.getString("QuestName"); + } this.isLeader = ClientCacheHandler.party.getPartyLeaderName().equals(this.player.getCommandSenderName()); + System.out.println("KEY:" + trackedQuestKey); } else if (compound.hasKey("Disband")) { this.isLeader = false; } else if (compound.hasKey("PartyInvites")) { @@ -429,6 +458,9 @@ public class GuiParty extends GuiCNPCInventory implements ITextfieldListener,ICu if(ClientCacheHandler.party != null) Client.sendData(EnumPacketServer.SavePartyData, ClientCacheHandler.party.writeClientNBT()); } + if (!Objects.equals(this.originalTracked, data.trackedQuestKey)) { + Client.sendData(EnumPacketServer.PartyLogToServer, this.data.trackedQuestKey); + } } @Override diff --git a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiQuestLog.java b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiQuestLog.java index a8ed79e2e..c9f9aa934 100644 --- a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiQuestLog.java +++ b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiQuestLog.java @@ -98,7 +98,6 @@ public class GuiQuestLog extends GuiCNPCInventory implements ICustomScrollListen showTrackAlerts = false; } } - } @@ -125,11 +124,7 @@ public class GuiQuestLog extends GuiCNPCInventory implements ICustomScrollListen } GuiNpcButton trackingButton = new GuiNpcButton(4, guiLeft + 260, guiTop + 151, 50, 20, new String[]{"quest.track", "quest.tracking"}, data.trackedQuestKey.equals(data.selectedCategory + ":" + data.selectedQuest) ? 1 : 0); - if (trackingButton.displayString.equals("quest.tracking")) { - trackingButton.packedFGColour = 0x32CD32; - } addButton(trackingButton); - GuiNpcButton alertButton = new GuiNpcButton(5, guiLeft + 205, guiTop + 151, 50, 20, new String[]{"quest.alerts", "quest.noAlerts"}, data.getQuestAlerts() ? 0 : 1); addButton(alertButton); @@ -141,11 +136,15 @@ public class GuiQuestLog extends GuiCNPCInventory implements ICustomScrollListen getButton(3).visible = !data.selectedQuest.isEmpty() && getButton(1).visible; if(getButton(4) != null){ getButton(4).visible = !data.selectedQuest.isEmpty() && getButton(1).visible; - getButton(4).enabled = showTrackAlerts; + getButton(4).enabled = showTrackAlerts && !isPartySet; } if(getButton(5) != null){ getButton(5).visible = getButton(4).visible; - getButton(5).enabled = showTrackAlerts; + getButton(5).enabled = showTrackAlerts && !isPartySet; + } + + if (trackingButton.enabled && trackingButton.getValue() == 1) { + trackingButton.packedFGColour = 0x32CD32; } } diff --git a/src/main/java/noppes/npcs/constants/EnumPacketServer.java b/src/main/java/noppes/npcs/constants/EnumPacketServer.java index 2bc45401f..281798250 100644 --- a/src/main/java/noppes/npcs/constants/EnumPacketServer.java +++ b/src/main/java/noppes/npcs/constants/EnumPacketServer.java @@ -98,7 +98,7 @@ public enum EnumPacketServer { AnimationsGet, AnimationGet, AnimationRemove(CustomNpcsPermissions.GLOBAL_ANIMATION), AnimationSave(CustomNpcsPermissions.GLOBAL_ANIMATION), - RecipesGet, RecipeGet, QuestOpenGui, PlayerDataGet, QuestLogToServer, + RecipesGet, RecipeGet, QuestOpenGui, PlayerDataGet, QuestLogToServer, PartyLogToServer, RemoteNpcsGet(CustomNpcsPermissions.NPC_GUI), RemoteTpToNpc(CustomNpcsPermissions.NPC_TELEPORT), diff --git a/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java b/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java index e89854166..4834c9d25 100644 --- a/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java +++ b/src/main/java/noppes/npcs/constants/EnumPlayerPacket.java @@ -2,7 +2,7 @@ package noppes.npcs.constants; public enum EnumPlayerPacket { FollowerHire,FollowerExtend,Trader, FollowerState, Transport, BankUnlock, BankUpgrade, - Dialog, QuestLog, CheckQuestCompletion, BankSlotOpen, FactionsGet, + Dialog, QuestLog, TrackedQuest, CheckQuestCompletion, BankSlotOpen, FactionsGet, MailGet, MailDelete, MailSend, MailRead, MailboxOpenMail, SignSave, SaveBook, CompanionOpenInv, RoleGet, KeyPressed, MouseClicked, CompanionTalentExp, ScreenSize, MarkData diff --git a/src/main/java/noppes/npcs/controllers/PartyController.java b/src/main/java/noppes/npcs/controllers/PartyController.java index 93b9c036f..34f4f6870 100644 --- a/src/main/java/noppes/npcs/controllers/PartyController.java +++ b/src/main/java/noppes/npcs/controllers/PartyController.java @@ -6,6 +6,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; import noppes.npcs.EventHooks; +import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.NoppesUtilServer; import noppes.npcs.Server; import noppes.npcs.api.entity.IPlayer; @@ -119,6 +120,7 @@ public class PartyController { if (party.getQuest() != null) { Quest quest = (Quest) party.getQuest(); Vector vector = quest.questInterface.getPartyQuestLogStatus(party); + compound.setString("QuestName", quest.getCategory().getName() + ":" + quest.getName()); NBTTagList list = new NBTTagList(); for (String s : vector) { list.appendTag(new NBTTagString(s)); @@ -150,6 +152,7 @@ public class PartyController { Quest quest = (Quest) party.getQuest(); Vector vector = quest.questInterface.getPartyQuestLogStatus(party); NBTTagList list = new NBTTagList(); + compound.setString("QuestName", quest.getCategory().getName() + ":" + quest.getName()); for (String s : vector) { list.appendTag(new NBTTagString(s)); } @@ -201,7 +204,6 @@ public class PartyController { EventHooks.onPartyFinished(party, questData.quest); PartyController.Instance().sendQuestChat(party, "party.turnedInChat"); } else { - party.setQuest(null); PartyController.Instance().sendQuestChat(party, "party.completeChat"); } PartyController.Instance().pingPartyUpdate(party); @@ -210,9 +212,17 @@ public class PartyController { questData.isCompleted = false; } -// if (this.trackedQuest != null && questData.quest.getId() == this.trackedQuest.getId()) { -// NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) player); -// } + for (String name : party.getPlayerNames()) { + EntityPlayer playerMP = NoppesUtilServer.getPlayerByName(name); + if (playerMP != null) { + PlayerData playerData = PlayerDataController.Instance.getPlayerData(playerMP); + if(playerData != null){ + if (playerData.questData.getTrackedQuest() != null && questData.quest.getId() == playerData.questData.getTrackedQuest().getId()) { + NoppesUtilPlayer.sendPartyTrackedQuestData((EntityPlayerMP) playerMP, party); + } + } + } + } } } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java index 6199d9ad6..73edd5d52 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerQuestData.java @@ -8,6 +8,7 @@ import noppes.npcs.EventHooks; import noppes.npcs.NoppesUtilPlayer; import noppes.npcs.Server; import noppes.npcs.api.handler.IPlayerQuestData; +import noppes.npcs.api.handler.data.IParty; import noppes.npcs.api.handler.data.IQuest; import noppes.npcs.constants.*; import noppes.npcs.controllers.PartyController; @@ -183,6 +184,17 @@ public class PlayerQuestData implements IPlayerQuestData { } } + public void trackParty(IParty party) { + if(party == null) + return; + + IQuest quest = party.getQuest(); + if (this.trackedQuest == null || quest.getId() != this.trackedQuest.getId()) { + this.trackedQuest = quest; + NoppesUtilPlayer.sendPartyTrackedQuestData((EntityPlayerMP) this.parent.player, (Party) party); + } + } + public void untrackQuest() { if (this.trackedQuest != null) { this.trackedQuest = null; diff --git a/src/main/java/noppes/npcs/quests/QuestDialog.java b/src/main/java/noppes/npcs/quests/QuestDialog.java index 72b58b9f7..a4e73b5a6 100644 --- a/src/main/java/noppes/npcs/quests/QuestDialog.java +++ b/src/main/java/noppes/npcs/quests/QuestDialog.java @@ -454,6 +454,28 @@ public class QuestDialog extends QuestInterface implements IQuestDialog { @Override public String getAdditionalText() { + if(party != null && party.getObjectiveRequirement() == EnumPartyObjectives.All){ + List incomplete = new ArrayList<>(); + for (UUID uuid: party.getPlayerUUIDs()) { + EntityPlayer individual = NoppesUtilServer.getPlayer(uuid); + PlayerData individualData; + if(individual != null){ + individualData = PlayerDataController.Instance.getPlayerData(individual); + } + else { + individualData = PlayerDataController.Instance.getPlayerDataCache(uuid.toString()); + } + if(individualData != null){ + boolean read = individualData.dialogData.dialogsRead.contains(this.dialog.id); + if(!read) { + incomplete.add(individualData.playername); + } + } + } + if(!incomplete.isEmpty()) + return "[" + String.join(", ", incomplete) + "]"; + + } return null; } } diff --git a/src/main/java/noppes/npcs/quests/QuestItem.java b/src/main/java/noppes/npcs/quests/QuestItem.java index 124b369e6..083d7b3b5 100644 --- a/src/main/java/noppes/npcs/quests/QuestItem.java +++ b/src/main/java/noppes/npcs/quests/QuestItem.java @@ -528,6 +528,29 @@ public class QuestItem extends QuestInterface implements IQuestItem { @Override public String getAdditionalText() { + if(party != null && party.getObjectiveRequirement() == EnumPartyObjectives.All) { + List incompletePlayers = new ArrayList<>(); + EnumPartyObjectives objectives = party.getObjectiveRequirement(); + for (String name : party.getPlayerNames()) { + EntityPlayer playerMP = NoppesUtilServer.getPlayerByName(name); + if (playerMP == null){ + incompletePlayers.add(name + ": " + "N/A"); + continue; + } + + int amount = 0; + for (ItemStack is : playerMP.inventory.mainInventory) { + if (NoppesUtilPlayer.compareItems(this.questItem, is, ignoreDamage, ignoreNBT)) + amount += is.stackSize; + } + + int completedSize = ValueUtil.clamp(amount, 0, this.questItem.stackSize); + if(completedSize < this.questItem.stackSize) + incompletePlayers.add(name + ": " + completedSize); + } + if(!incompletePlayers.isEmpty()) + return "[" + String.join(", ", incompletePlayers) + "]"; + } return null; } } diff --git a/src/main/java/noppes/npcs/quests/QuestKill.java b/src/main/java/noppes/npcs/quests/QuestKill.java index 3e2a377b2..a62a0f58d 100644 --- a/src/main/java/noppes/npcs/quests/QuestKill.java +++ b/src/main/java/noppes/npcs/quests/QuestKill.java @@ -348,11 +348,35 @@ public class QuestKill extends QuestInterface implements IQuestKill { } public String getText() { + if(party != null) { + if(party.getObjectiveRequirement() == EnumPartyObjectives.All ){ + return this.entity + ": " + this.getMaxProgress() + (isCompleted() ? " (Done)" : ""); + } + } return this.entity + ": " + this.getProgress() + "/" + this.getMaxProgress(); } @Override public String getAdditionalText() { + if(party != null) { + List incompletePlayers = new ArrayList<>(); + QuestData questdata = party.getQuestData(); + if (questdata != null) { + if (questdata.quest.partyOptions.objectiveRequirement == EnumPartyObjectives.All) { + for (String player : party.getPlayerNames()) { + HashMap killed = this.parent.getPlayerKilled(questdata, player); + int currentProgress = !killed.containsKey(this.entity) ? 0 : (Integer) killed.get(this.entity); + if(currentProgress < this.amount){ + String state = player + ": " + currentProgress; + incompletePlayers.add(state); + } + } + if(!incompletePlayers.isEmpty()) + return "[" + String.join(", ", incompletePlayers) + "]"; + } + } + } + return null; } } diff --git a/src/main/java/noppes/npcs/quests/QuestLocation.java b/src/main/java/noppes/npcs/quests/QuestLocation.java index fcd480316..44bb59dcf 100644 --- a/src/main/java/noppes/npcs/quests/QuestLocation.java +++ b/src/main/java/noppes/npcs/quests/QuestLocation.java @@ -260,6 +260,17 @@ public class QuestLocation extends QuestInterface implements IQuestLocation { return vec; } + public boolean isMultiQuest(Party party){ + QuestData data = party.getQuestData(); + if(data == null) + return false; + + if(data.quest == null) + return false; + + return data.quest.partyOptions.objectiveRequirement == EnumPartyObjectives.All; + } + @Override public boolean isPartyCompleted(Party party) { if(party == null) @@ -383,7 +394,9 @@ public class QuestLocation extends QuestInterface implements IQuestLocation { } public String getAdditionalText() { - return "Completed: " + String.join(", ", completedPlayers); + if(party != null && parent.isMultiQuest(party) && completedPlayers.size() != party.getPlayerNames().size()) + return "Completed: " + String.join(", ", completedPlayers); + return null; } } }