diff --git a/src/main/java/noppes/npcs/NoppesUtilPlayer.java b/src/main/java/noppes/npcs/NoppesUtilPlayer.java index a40fe83e9..7290bef48 100644 --- a/src/main/java/noppes/npcs/NoppesUtilPlayer.java +++ b/src/main/java/noppes/npcs/NoppesUtilPlayer.java @@ -626,11 +626,12 @@ public class NoppesUtilPlayer { } playerData.save(); - if(meetsComplete){ - Server.sendData((EntityPlayerMP)player, EnumPacketClient.QUEST_COMPLETION, data.quest.writeToNBT(new NBTTagCompound())); - } + Server.sendData((EntityPlayerMP)player, EnumPacketClient.QUEST_COMPLETION, data.quest.writeToNBT(new NBTTagCompound())); } + if(quest.type == EnumQuestType.Item && partyOptions.objectiveRequirement == EnumPartyObjectives.Shared){ + quest.questInterface.removePartyItems(party); + } if (hasNextQuest) { if(party.validateQuest(data.quest.getNextQuest().getId(), true)){ diff --git a/src/main/java/noppes/npcs/quests/QuestInterface.java b/src/main/java/noppes/npcs/quests/QuestInterface.java index b84722421..46b876076 100644 --- a/src/main/java/noppes/npcs/quests/QuestInterface.java +++ b/src/main/java/noppes/npcs/quests/QuestInterface.java @@ -30,6 +30,8 @@ public abstract class QuestInterface implements IQuestInterface { handleComplete(player); } + public void removePartyItems(Party party){} + public abstract Vector getQuestLogStatus(EntityPlayer player); public abstract IQuestObjective[] getObjectives(EntityPlayer var1); diff --git a/src/main/java/noppes/npcs/quests/QuestItem.java b/src/main/java/noppes/npcs/quests/QuestItem.java index fdae99002..b5c325d7a 100644 --- a/src/main/java/noppes/npcs/quests/QuestItem.java +++ b/src/main/java/noppes/npcs/quests/QuestItem.java @@ -106,9 +106,62 @@ public class QuestItem extends QuestInterface implements IQuestItem { removeItems(player); } else if (objectives == EnumPartyObjectives.Shared){ // Shared Case + // Do nothing, handled later in quest completion } } + public void removePartyItems(Party party) { + // Iterate through each quest item in the list + for (ItemStack questItem : items.items.values()) { + int remainingItems = questItem.stackSize; + + // Iterate through all members of the party + for (UUID uuid : party.getPlayerUUIDs()) { + EntityPlayer player = NoppesUtilServer.getPlayer(uuid); + if (player != null) { + int removedItems = removeItemFromPlayer(player, questItem, remainingItems); + remainingItems -= removedItems; + + // If no remaining items are needed for this quest item, move to the next one + if (remainingItems <= 0) { + break; + } + } + } + } + } + + + private int removeItemFromPlayer(EntityPlayer player, ItemStack questItem, int numItemsToRemove) { + int itemsRemoved = 0; + + // Iterate through the player's inventory + for (int i = 0; i < player.inventory.mainInventory.length && itemsRemoved < numItemsToRemove; i++) { + ItemStack itemStack = player.inventory.mainInventory[i]; + if (itemStack == null) + continue; + if (NoppesUtilPlayer.compareItems(itemStack, questItem, ignoreDamage, ignoreNBT)) { + int itemsToRemoveFromStack = Math.min(itemStack.stackSize, numItemsToRemove - itemsRemoved); + int size = itemStack.stackSize; + if (itemsToRemoveFromStack >= size) { + player.inventory.setInventorySlotContents(i, null); + itemsRemoved += size; + } else { + itemStack.stackSize -= itemsToRemoveFromStack; + itemsRemoved += itemsToRemoveFromStack; + } + + // If there are no more remaining items to remove, break out of the loop + if (itemsRemoved >= numItemsToRemove) { + break; + } + } + } + return itemsRemoved; + } + + + public void removeItems(EntityPlayer player){ for(ItemStack questitem : items.items.values()){ int stacksize = questitem.stackSize;