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/Blocks/BlockCauldron.h | 40 +++++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) (limited to 'src/Blocks') diff --git a/src/Blocks/BlockCauldron.h b/src/Blocks/BlockCauldron.h index 5b45b2828..d6ef721ad 100644 --- a/src/Blocks/BlockCauldron.h +++ b/src/Blocks/BlockCauldron.h @@ -27,17 +27,31 @@ public: virtual bool OnUse(cChunkInterface & a_ChunkInterface, cWorldInterface & a_WorldInterface, cPlayer & a_Player, int a_BlockX, int a_BlockY, int a_BlockZ, eBlockFace a_BlockFace, int a_CursorX, int a_CursorY, int a_CursorZ) override { NIBBLETYPE Meta = a_ChunkInterface.GetBlockMeta({a_BlockX, a_BlockY, a_BlockZ}); - switch (a_Player.GetEquippedItem().m_ItemType) + auto EquippedItem = a_Player.GetEquippedItem(); + switch (EquippedItem.m_ItemType) { + case E_ITEM_BUCKET: + { + if (Meta == 3) + { + a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 0); + // Give new bucket, filled with fluid when the gamemode is not creative: + if (!a_Player.IsGameModeCreative()) + { + a_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_WATER_BUCKET)); + } + } + break; + } case E_ITEM_WATER_BUCKET: { if (Meta < 3) { a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, 3); + // Give empty bucket back when the gamemode is not creative: if (!a_Player.IsGameModeCreative()) { - a_Player.GetInventory().RemoveOneEquippedItem(); - a_Player.GetInventory().AddItem(cItem(E_ITEM_BUCKET)); + a_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_BUCKET)); } } break; @@ -47,11 +61,27 @@ public: if (Meta > 0) { a_ChunkInterface.SetBlockMeta(a_BlockX, a_BlockY, a_BlockZ, --Meta); - a_Player.GetInventory().RemoveOneEquippedItem(); - a_Player.GetInventory().AddItem(cItem(E_ITEM_POTION)); + // Give new potion when the gamemode is not creative: + if (!a_Player.IsGameModeCreative()) + { + a_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_POTION)); + } } break; } + case E_ITEM_POTION: + { + // Refill cauldron with water bottles. + if ((Meta < 3) && (EquippedItem.m_ItemDamage == 0)) + { + a_ChunkInterface.SetBlockMeta(Vector3i(a_BlockX, a_BlockY, a_BlockZ), ++Meta); + // Give empty bottle when the gamemode is not creative: + if (!a_Player.IsGameModeCreative()) + { + a_Player.ReplaceOneEquippedItemTossRest(cItem(E_ITEM_GLASS_BOTTLE)); + } + } + } } return true; } -- cgit v1.2.3