From 1c77828f28b9131c514def06ddedd68f0f7185d9 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 7 Mar 2024 04:16:34 -0500 Subject: [PATCH] Quest Item for Party --- .../java/noppes/npcs/ServerEventsHandler.java | 5 +- .../npcs/controllers/PartyController.java | 50 ++- .../java/noppes/npcs/quests/QuestItem.java | 288 +++++++++++++++--- 3 files changed, 279 insertions(+), 64 deletions(-) diff --git a/src/main/java/noppes/npcs/ServerEventsHandler.java b/src/main/java/noppes/npcs/ServerEventsHandler.java index bb88a0e7f..8f7821de7 100644 --- a/src/main/java/noppes/npcs/ServerEventsHandler.java +++ b/src/main/java/noppes/npcs/ServerEventsHandler.java @@ -456,8 +456,11 @@ public class ServerEventsHandler { QuestItem.pickedUp = event.item.getEntityItem(); Party playerParty = playerData.getPlayerParty(); - if(playerParty != null) + if(playerParty != null){ + QuestItem.pickedUpParty = event.item.getEntityItem(); + QuestItem.pickedUpPlayer = event.entityPlayer; PartyController.Instance().checkQuestCompletion(playerParty, EnumQuestType.Item); + } questData.checkQuestCompletion(playerData, EnumQuestType.Item); } diff --git a/src/main/java/noppes/npcs/controllers/PartyController.java b/src/main/java/noppes/npcs/controllers/PartyController.java index 1fe38139f..e8bc492f9 100644 --- a/src/main/java/noppes/npcs/controllers/PartyController.java +++ b/src/main/java/noppes/npcs/controllers/PartyController.java @@ -189,34 +189,32 @@ public class PartyController { } public boolean checkQuestCompletion(Party party, EnumQuestType type) { - boolean bo = false; QuestData questData = party.getQuestData(); - if(questData == null) - return bo; - - if(questData.quest.type != type && type != null) - return bo; - - QuestInterface inter = questData.quest.questInterface; - if(inter.isPartyCompleted(party)){ - if((!questData.isCompleted && questData.quest.completion == EnumQuestCompletion.Npc) || questData.quest.instantPartyComplete(party)){ - questData.isCompleted = true; - if (questData.quest.completion == EnumQuestCompletion.Npc) { - EventHooks.onPartyFinished(party, questData.quest); + if(questData != null){ + if(questData.quest.type != type && type != null){ + QuestInterface inter = questData.quest.questInterface; + if(inter.isPartyCompleted(party)){ + if((!questData.isCompleted && questData.quest.completion == EnumQuestCompletion.Npc) || questData.quest.instantPartyComplete(party)){ + questData.isCompleted = true; + if (questData.quest.completion == EnumQuestCompletion.Npc) { + EventHooks.onPartyFinished(party, questData.quest); + } + party.setQuest(null); + PartyController.Instance().pingPartyUpdate(party); + PartyController.Instance().sendQuestChat(party, "party.completeChat"); + } + } else { + questData.isCompleted = false; } - bo = true; - party.setQuest(null); - PartyController.Instance().pingPartyUpdate(party); - PartyController.Instance().sendQuestChat(party, "party.completeChat"); - } - } else { - questData.isCompleted = false; - } -// if (this.trackedQuest != null && questData.quest.getId() == this.trackedQuest.getId()) { -// NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) player); -// } - QuestItem.pickedUp = null; - return bo; +// if (this.trackedQuest != null && questData.quest.getId() == this.trackedQuest.getId()) { +// NoppesUtilPlayer.sendTrackedQuestData((EntityPlayerMP) player); +// } + } + } + + QuestItem.pickedUpParty = null; + QuestItem.pickedUpPlayer = null; + return true; } } diff --git a/src/main/java/noppes/npcs/quests/QuestItem.java b/src/main/java/noppes/npcs/quests/QuestItem.java index 59d2d68f2..3bb3a447c 100644 --- a/src/main/java/noppes/npcs/quests/QuestItem.java +++ b/src/main/java/noppes/npcs/quests/QuestItem.java @@ -8,6 +8,8 @@ import noppes.npcs.NoppesUtilServer; import noppes.npcs.NpcMiscInventory; import noppes.npcs.api.handler.data.IQuestItem; import noppes.npcs.api.handler.data.IQuestObjective; +import noppes.npcs.constants.EnumPartyObjectives; +import noppes.npcs.controllers.PlayerDataController; import noppes.npcs.controllers.data.Party; import noppes.npcs.controllers.data.PlayerData; import noppes.npcs.scripted.CustomNPCsException; @@ -18,6 +20,10 @@ import java.util.*; public class QuestItem extends QuestInterface implements IQuestItem { public NpcMiscInventory items = new NpcMiscInventory(3); public static ItemStack pickedUp; + + public static ItemStack pickedUpParty; + public static EntityPlayer pickedUpPlayer; + public boolean leaveItems = false; public boolean ignoreDamage = false; public boolean ignoreNBT = false; @@ -162,48 +168,214 @@ public class QuestItem extends QuestInterface implements IQuestItem { @Override public Vector getPartyQuestLogStatus(Party party) { Vector vec = new Vector(); - HashMap map = getProcessSetParty(party); - for(int slot : map.keySet()){ - ItemStack item = map.get(slot); - ItemStack quest = items.items.get(slot); - if(item == null) - continue; - String process = item.stackSize + ""; - if(item.stackSize > quest.stackSize) - process = quest.stackSize + ""; - process += "/" + quest.stackSize + ""; - if(item.hasDisplayName()) - vec.add(item.getDisplayName() + ": " + process); - else - vec.add(item.getUnlocalizedName() + ".name" + ": " + process); + if(party == null || party.getObjectiveRequirement() == null) + return vec; + + EnumPartyObjectives objectives = party.getObjectiveRequirement(); + if(objectives == EnumPartyObjectives.All){ + // Slot, QuestItem Vector + HashMap questVector = new HashMap<>(); + HashMap> playerVector = new HashMap<>(); + for(int slot : items.items.keySet()){ + ItemStack questItem = items.items.get(slot); + if(questItem != null){ + if(questItem.hasDisplayName()) + questVector.put(slot, questItem.getDisplayName() + ": " + questItem.stackSize); + else + questVector.put(slot, questItem.getUnlocalizedName() + ".name" + ": " + questItem.stackSize); + + playerVector.put(slot, new ArrayList<>()); + } + } + + // Slot, List of Players and Their Item Counts + + for (UUID uuid: party.getPlayerUUIDs()) { + EntityPlayer player = NoppesUtilServer.getPlayer(uuid); + if(player != null){ + HashMap perPlayerMap = getProcessSetParty(player); + for(int slot : perPlayerMap.keySet()){ + List slotCurrent = playerVector.get(slot); + ItemStack item = perPlayerMap.get(slot); + ItemStack quest = items.items.get(slot); + if(item == null) + continue; + if(quest == null) + continue; + if(item.stackSize > quest.stackSize) + continue; + if(item.hasDisplayName()) + slotCurrent.add(player.getCommandSenderName() + ": " + item.getDisplayName() + ": " + item.stackSize); + else + slotCurrent.add(player.getCommandSenderName() + ": " + item.getUnlocalizedName() + ".name" + ": " + item.stackSize); + playerVector.put(slot, slotCurrent); + } + } + } + + // Add entries to the vec vector + for (int slot : questVector.keySet()) { + String questEntry = questVector.get(slot); + vec.add(questEntry); + List playerItems = playerVector.get(slot); + if (playerItems != null && !playerItems.isEmpty()) { + StringBuilder playerNamesBuilder = new StringBuilder(); + for (String playerName : playerItems) { + if (playerNamesBuilder.length() > 0) { + playerNamesBuilder.append(", "); + } + playerNamesBuilder.append(playerName); + } + vec.add("[" + playerNamesBuilder.toString() + "]"); + } + } + } else if (objectives == EnumPartyObjectives.Shared || objectives == EnumPartyObjectives.Leader){ + HashMap totals = new HashMap(); + for (int slot : items.items.keySet()) { + ItemStack item = items.items.get(slot); + if (item != null) { + totals.put(slot, 0); + } + } + // Iterate over each player in the party + for (UUID uuid : party.getPlayerUUIDs()) { + if(uuid == null) + continue; + + if(objectives == EnumPartyObjectives.Leader && !party.getLeaderUUID().equals(uuid)) + continue; + + EntityPlayer player = NoppesUtilServer.getPlayer(uuid); + if (player != null) { + HashMap perPlayerMap = getProcessSetParty(player); + for (Map.Entry entry : items.items.entrySet()) { + int slot = entry.getKey(); + ItemStack reqItem = entry.getValue(); + for(ItemStack item : perPlayerMap.values()){ + if(NoppesUtilPlayer.compareItems(reqItem, item, ignoreDamage, ignoreNBT)){ + int count = totals.get(slot); + count += item.stackSize; + totals.put(slot, count); + } + } + } + } + } + + // Check if the total count of required items collected by the party exceeds the required amount for each slot + for (int slot : items.items.keySet()) { + ItemStack reqItem = items.items.get(slot); + if(reqItem == null) + continue; + + int totalCount = totals.get(slot); + if (totalCount > reqItem.stackSize) { + totalCount = reqItem.stackSize; + } + String process = totalCount + "/" + reqItem.stackSize; + if(reqItem.hasDisplayName()) + vec.add(reqItem.getDisplayName() + ": " + process); + else + vec.add(reqItem.getUnlocalizedName() + ".name" + ": " + process); + } } return vec; } @Override public boolean isPartyCompleted(Party party) { - if(party == null) + if(party == null || party.getObjectiveRequirement() == null) return false; - HashMap map = getProcessSetParty(party); - for(ItemStack reqItem : items.items.values()){ - boolean done = false; - for(ItemStack item : map.values()){ - if(NoppesUtilPlayer.compareItems(reqItem, item, ignoreDamage, ignoreNBT) && item.stackSize >= reqItem.stackSize){ - done = true; - break; + EnumPartyObjectives objectives = party.getObjectiveRequirement(); + if(objectives == EnumPartyObjectives.All){ + for (UUID uuid: party.getPlayerUUIDs()) { + EntityPlayer player = NoppesUtilServer.getPlayer(uuid); + if(player != null){ + HashMap perPlayerMap = getProcessSetParty(player); + for(ItemStack reqItem : items.items.values()){ + boolean done = false; + for(ItemStack item : perPlayerMap.values()){ + if(NoppesUtilPlayer.compareItems(reqItem, item, ignoreDamage, ignoreNBT) && item.stackSize >= reqItem.stackSize){ + done = true; + break; + } + } + if(!done) + return false; + } + } + } + } else if (objectives == EnumPartyObjectives.Shared || objectives == EnumPartyObjectives.Leader){ + HashMap totals = new HashMap(); + for (int slot : items.items.keySet()) { + ItemStack item = items.items.get(slot); + if (item != null) { + totals.put(slot, 0); } } - if(!done) - return false; - } + // Iterate over each player in the party + for (UUID uuid : party.getPlayerUUIDs()) { + if(uuid == null) + continue; + + if(objectives == EnumPartyObjectives.Leader && !party.getLeaderUUID().equals(uuid)) + continue; + + EntityPlayer player = NoppesUtilServer.getPlayer(uuid); + if (player != null) { + HashMap perPlayerMap = getProcessSetParty(player); + for (Map.Entry entry : items.items.entrySet()) { + int slot = entry.getKey(); + ItemStack reqItem = entry.getValue(); + for(ItemStack item : perPlayerMap.values()){ + if(NoppesUtilPlayer.compareItems(reqItem, item, ignoreDamage, ignoreNBT)){ + int count = totals.get(slot); + count += item.stackSize; + totals.put(slot, count); + } + } + } + } + } + + // Check if the total count of required items collected by the party exceeds the required amount for each slot + for (int slot : items.items.keySet()) { + ItemStack reqItem = items.items.get(slot); + int totalCount = totals.get(slot); + if (totalCount < reqItem.stackSize) { + return false; // Party has not completed the objective + } + } + } return true; } - - public HashMap getProcessSetParty(Party party){ + public HashMap getProcessSetParty(EntityPlayer player){ HashMap map = new HashMap(); + for(int slot : items.items.keySet()){ + ItemStack item = items.items.get(slot); + if(item == null) + continue; + ItemStack is = item.copy(); + is.stackSize = 0; + map.put(slot,is); + } + + ArrayList list = new ArrayList<>(Arrays.asList(player.inventory.mainInventory)); + if(pickedUpPlayer != null && player.getCommandSenderName().equals(pickedUpPlayer.getCommandSenderName())) + list.add(pickedUpParty); + + for(ItemStack item : list){ + if(item == null) + continue; + for(ItemStack questItem : map.values()){ + if(NoppesUtilPlayer.compareItems(questItem, item, ignoreDamage, ignoreNBT)){ + questItem.stackSize += item.stackSize; + } + } + } return map; } @@ -249,31 +421,46 @@ public class QuestItem extends QuestInterface implements IQuestItem { public int getProgress() { int count = 0; - - ItemStack item = QuestItem.pickedUp; - if (!NoppesUtilServer.IsItemStackNull(item) && NoppesUtilPlayer.compareItems(this.questItem, item, this.parent.ignoreDamage, this.parent.ignoreNBT)) { - count += item.stackSize; - } - if(player != null){ + ItemStack item = QuestItem.pickedUp; + if (!NoppesUtilServer.IsItemStackNull(item) && NoppesUtilPlayer.compareItems(this.questItem, item, this.parent.ignoreDamage, this.parent.ignoreNBT)) { + count += item.stackSize; + } + for(int i = 0; i < this.player.inventory.getSizeInventory(); ++i) { item = this.player.inventory.getStackInSlot(i); if (!NoppesUtilServer.IsItemStackNull(item) && NoppesUtilPlayer.compareItems(this.questItem, item, this.parent.ignoreDamage, this.parent.ignoreNBT)) { count += item.stackSize; } } - } else if (party != null){ + } else if (party != null && party.getObjectiveRequirement() != null){ + ItemStack item; + EnumPartyObjectives objectives = party.getObjectiveRequirement(); for(String name : party.getPlayerNames()){ EntityPlayer playerMP = NoppesUtilServer.getPlayerByName(name); if(playerMP == null) continue; + if(!playerMP.getUniqueID().equals(party.getLeaderUUID()) && objectives == EnumPartyObjectives.Leader) + continue; + + int amount = 0; for(int i = 0; i < playerMP.inventory.getSizeInventory(); ++i) { item = playerMP.inventory.getStackInSlot(i); if (!NoppesUtilServer.IsItemStackNull(item) && NoppesUtilPlayer.compareItems(this.questItem, item, this.parent.ignoreDamage, this.parent.ignoreNBT)) { - count += item.stackSize; + amount += item.stackSize; } } + + if(objectives == EnumPartyObjectives.All){ + count += ValueUtil.clamp(amount, 0, this.questItem.stackSize); + } else { + count += amount; + } + } + + if(objectives == EnumPartyObjectives.All){ + return ValueUtil.clamp(count, 0, this.questItem.stackSize * party.getPlayerNames().size()); } } @@ -285,6 +472,13 @@ public class QuestItem extends QuestInterface implements IQuestItem { } public int getMaxProgress() { + if(party != null && party.getObjectiveRequirement() != null){ + EnumPartyObjectives objectives = party.getObjectiveRequirement(); + if(objectives == EnumPartyObjectives.All){ + return this.questItem.stackSize * party.getPlayerNames().size(); + } + } + return this.questItem.stackSize; } @@ -299,15 +493,35 @@ public class QuestItem extends QuestInterface implements IQuestItem { public boolean comparePartyItems(Party party, ItemStack item, boolean ignoreDamage, boolean ignoreNBT){ int size = 0; + if(party.getObjectiveRequirement() == null) + return false; + + EnumPartyObjectives objectives = party.getObjectiveRequirement(); for(String name : party.getPlayerNames()){ EntityPlayer playerMP = NoppesUtilServer.getPlayerByName(name); if(playerMP == null) continue; + + if(objectives == EnumPartyObjectives.Leader && !playerMP.getUniqueID().equals(party.getLeaderUUID())) + continue; + + int amount = 0; for(ItemStack is : playerMP.inventory.mainInventory){ - if(is != null && NoppesUtilPlayer.compareItems(item, is, ignoreDamage, ignoreNBT)) - size += is.stackSize; + if(NoppesUtilPlayer.compareItems(item, is, ignoreDamage, ignoreNBT)) + amount += is.stackSize; + } + + if(objectives == EnumPartyObjectives.All){ + size += ValueUtil.clamp(amount, 0, this.questItem.stackSize); + } else { + size += amount; } } + + if(objectives == EnumPartyObjectives.All){ + return size >= item.stackSize * party.getPlayerNames().size(); + } + return size >= item.stackSize; }