From cdc452916e3ec7e61f4a1ad822666192593b4b08 Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Thu, 2 Apr 2020 12:42:15 +0000 Subject: Replace buckets to the selected hotbar slot, rather than the first available. (#4580) * Replace buckets to the selected hotbar slot, rather than the first available. Replicates vanilla behaviour, as well as being more logical. * Refactor cInventory::AddItem. Behaviour is now documented * Add new cInventory::ReplaceOneEquippedItem and ::SetEquippedItem methods * Return empty potion to the same slot after drinking * Replace buckets correctly in other situations, not simply water and lava Uses the new ReplaceOneEquippedItem method * Correct collecting water from source block with bottle * Add cPlayer::ReplaceOneEquippedItemTossRest method * Handle stacked filled buckets (in theory) Use new cPlayer::ReplaceOneEquippedItemTossRest method --- src/Items/ItemBucket.h | 32 ++++++-------------------------- 1 file changed, 6 insertions(+), 26 deletions(-) (limited to 'src/Items/ItemBucket.h') diff --git a/src/Items/ItemBucket.h b/src/Items/ItemBucket.h index 7a91149d1..8affff6ca 100644 --- a/src/Items/ItemBucket.h +++ b/src/Items/ItemBucket.h @@ -70,15 +70,15 @@ public: } BLOCKTYPE Block = a_World->GetBlock(BlockPos.x, BlockPos.y, BlockPos.z); - ENUM_ITEM_ID NewItem; + ENUM_ITEM_ID NewItemType; if (IsBlockWater(Block)) { - NewItem = E_ITEM_WATER_BUCKET; + NewItemType = E_ITEM_WATER_BUCKET; } else if (IsBlockLava(Block)) { - NewItem = E_ITEM_LAVA_BUCKET; + NewItemType = E_ITEM_LAVA_BUCKET; } else { @@ -101,18 +101,7 @@ public: // Give new bucket, filled with fluid when the gamemode is not creative: if (!a_Player->IsGameModeCreative()) { - // Remove the bucket from the inventory - if (!a_Player->GetInventory().RemoveOneEquippedItem()) - { - LOG("Clicked with an empty bucket, but cannot remove one from the inventory? WTF?"); - ASSERT(!"Inventory bucket mismatch"); - return true; - } - if (a_Player->GetInventory().AddItem(cItem(NewItem)) != 1) - { - // The bucket didn't fit, toss it as a pickup: - a_Player->TossPickup(cItem(NewItem)); - } + a_Player->ReplaceOneEquippedItemTossRest(cItem(NewItemType)); } return true; @@ -154,19 +143,10 @@ public: return false; } + // Give back an empty bucket if the gamemode is not creative: if (!a_Player->IsGameModeCreative()) { - // Remove fluid bucket, add empty bucket: - if (!a_Player->GetInventory().RemoveOneEquippedItem()) - { - LOG("Clicked with a full bucket, but cannot remove one from the inventory? WTF?"); - ASSERT(!"Inventory bucket mismatch"); - return false; - } - if (!a_Player->GetInventory().AddItem(cItem(E_ITEM_BUCKET))) - { - return false; - } + a_Player->ReplaceOneEquippedItemTossRest(cItem(E_ITEM_BUCKET)); } // Wash away anything that was there prior to placing: -- cgit v1.2.3