From fd56aa2e6c18621a5f7957fa9d9e107fbee6784b Mon Sep 17 00:00:00 2001 From: David Markowitz Date: Sat, 1 Feb 2025 20:30:08 -0800 Subject: [PATCH] fix the wu man --- dCommon/dEnums/eInventoryType.h | 3 +- dGame/dComponents/InventoryComponent.cpp | 46 +++++++++++++------- dGame/dComponents/InventoryComponent.h | 4 +- dScripts/02_server/Map/AM/AmTeapotServer.cpp | 11 ++--- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/dCommon/dEnums/eInventoryType.h b/dCommon/dEnums/eInventoryType.h index 1c6688b22..05896ffbc 100644 --- a/dCommon/dEnums/eInventoryType.h +++ b/dCommon/dEnums/eInventoryType.h @@ -28,7 +28,8 @@ enum eInventoryType : uint32_t { DONATION, VAULT_MODELS, ITEM_SETS, //internal, technically this is BankBehaviors. - INVALID // made up, for internal use!!!, Technically this called the ALL inventory. + INVALID, // made up, for internal use!!!, Technically this called the ALL inventory. + ALL, // Use this to search all inventories instead of a specific one. }; class InventoryType { diff --git a/dGame/dComponents/InventoryComponent.cpp b/dGame/dComponents/InventoryComponent.cpp index aa7614aaf..44bb400c6 100644 --- a/dGame/dComponents/InventoryComponent.cpp +++ b/dGame/dComponents/InventoryComponent.cpp @@ -150,11 +150,11 @@ uint32_t InventoryComponent::GetLotCount(const LOT lot) const { return count; } -uint32_t InventoryComponent::GetLotCountNonTransfer(LOT lot) const { +uint32_t InventoryComponent::GetLotCountNonTransfer(LOT lot, bool includeVault) const { uint32_t count = 0; for (const auto& inventory : m_Inventories) { - if (IsTransferInventory(inventory.second->GetType())) continue; + if (IsTransferInventory(inventory.second->GetType(), includeVault)) continue; count += inventory.second->GetLotCount(lot); } @@ -305,21 +305,35 @@ bool InventoryComponent::RemoveItem(const LOT lot, const uint32_t count, eInvent LOG("Attempted to remove 0 of item (%i) from the inventory!", lot); return false; } - if (inventoryType == INVALID) inventoryType = Inventory::FindInventoryTypeForLot(lot); - auto* inventory = GetInventory(inventoryType); - if (!inventory) return false; + if (inventoryType != eInventoryType::ALL) { + if (inventoryType == INVALID) inventoryType = Inventory::FindInventoryTypeForLot(lot); + auto* inventory = GetInventory(inventoryType); + if (!inventory) return false; - auto left = std::min(count, inventory->GetLotCount(lot)); - if (left != count) return false; + auto left = std::min(count, inventory->GetLotCount(lot)); + if (left != count) return false; - while (left > 0) { - auto* item = FindItemByLot(lot, inventoryType, false, ignoreBound); - if (!item) break; - const auto delta = std::min(left, item->GetCount()); - item->SetCount(item->GetCount() - delta, silent); - left -= delta; + while (left > 0) { + auto* item = FindItemByLot(lot, inventoryType, false, ignoreBound); + if (!item) break; + const auto delta = std::min(left, item->GetCount()); + item->SetCount(item->GetCount() - delta, silent); + left -= delta; + } + return true; + } else { + auto left = count; + for (const auto& inventory : m_Inventories | std::views::values) { + while (left > 0 && inventory->GetLotCount(lot) > 0) { + auto* item = inventory->FindItemByLot(lot, false, ignoreBound); + if (!item) break; + const auto delta = std::min(item->GetCount(), left); + item->SetCount(item->GetCount() - delta, silent); + left -= delta; + } + } + return left == 0; } - return true; } void InventoryComponent::MoveItemToInventory(Item* item, const eInventoryType inventory, const uint32_t count, const bool showFlyingLot, bool isModMoveAndEquip, const bool ignoreEquipped, const int32_t preferredSlot) { @@ -1318,8 +1332,8 @@ BehaviorSlot InventoryComponent::FindBehaviorSlot(const eItemType type) { } } -bool InventoryComponent::IsTransferInventory(eInventoryType type) { - return type == VENDOR_BUYBACK || type == VAULT_ITEMS || type == VAULT_MODELS || type == TEMP_ITEMS || type == TEMP_MODELS || type == MODELS_IN_BBB; +bool InventoryComponent::IsTransferInventory(eInventoryType type, bool includeVault) { + return type == VENDOR_BUYBACK || (includeVault && (type == VAULT_ITEMS || type == VAULT_MODELS)) || type == TEMP_ITEMS || type == TEMP_MODELS || type == MODELS_IN_BBB; } uint32_t InventoryComponent::FindSkill(const LOT lot) { diff --git a/dGame/dComponents/InventoryComponent.h b/dGame/dComponents/InventoryComponent.h index 0055fcea7..395dd5d66 100644 --- a/dGame/dComponents/InventoryComponent.h +++ b/dGame/dComponents/InventoryComponent.h @@ -100,7 +100,7 @@ class InventoryComponent final : public Component { * @param lot the lot to search for * @return the amount of items this entity possesses of the specified lot */ - uint32_t GetLotCountNonTransfer(LOT lot) const; + uint32_t GetLotCountNonTransfer(LOT lot, bool includeVault = true) const; /** * Returns the items that are currently equipped by this entity @@ -373,7 +373,7 @@ class InventoryComponent final : public Component { * @param type the inventory type to check * @return if the inventory type is a temp inventory */ - static bool IsTransferInventory(eInventoryType type); + static bool IsTransferInventory(eInventoryType type, bool includeVault = true); /** * Finds the skill related to the passed LOT from the ObjectSkills table diff --git a/dScripts/02_server/Map/AM/AmTeapotServer.cpp b/dScripts/02_server/Map/AM/AmTeapotServer.cpp index 93f05326a..66c935ce8 100644 --- a/dScripts/02_server/Map/AM/AmTeapotServer.cpp +++ b/dScripts/02_server/Map/AM/AmTeapotServer.cpp @@ -8,16 +8,11 @@ void AmTeapotServer::OnUse(Entity* self, Entity* user) { auto* inventoryComponent = user->GetComponent(); if (!inventoryComponent) return; - auto* blueFlowerItem = inventoryComponent->FindItemByLot(BLUE_FLOWER_LEAVES, eInventoryType::ITEMS); - if (!blueFlowerItem) { - blueFlowerItem = inventoryComponent->FindItemByLot(BLUE_FLOWER_LEAVES, eInventoryType::VAULT_ITEMS); - if (!blueFlowerItem) return; - } - // The client allows you to use the teapot only if you have a stack of 10 leaves in some inventory somewhere. - if (blueFlowerItem->GetCount() >= 10) { - blueFlowerItem->SetCount(blueFlowerItem->GetCount() - 10); + if (inventoryComponent->GetLotCountNonTransfer(BLUE_FLOWER_LEAVES, false) >= 10) { + inventoryComponent->RemoveItem(BLUE_FLOWER_LEAVES, 10, eInventoryType::ALL); inventoryComponent->AddItem(WU_S_IMAGINATION_TEA, 1); } + GameMessages::SendTerminateInteraction(user->GetObjectID(), eTerminateType::FROM_INTERACTION, self->GetObjectID()); }