diff options
author | Tiger Wang <ziwei.tiger@outlook.com> | 2021-04-10 00:21:39 +0200 |
---|---|---|
committer | Tiger Wang <ziwei.tiger@outlook.com> | 2021-04-12 23:35:07 +0200 |
commit | 63ded9f6b4cc4cbcc0be6e0ace3c9158805139db (patch) | |
tree | 29521065017039da83709fef97a2aaf68be10ffa | |
parent | Add magical critical effect (diff) | |
download | cuberite-63ded9f6b4cc4cbcc0be6e0ace3c9158805139db.tar cuberite-63ded9f6b4cc4cbcc0be6e0ace3c9158805139db.tar.gz cuberite-63ded9f6b4cc4cbcc0be6e0ace3c9158805139db.tar.bz2 cuberite-63ded9f6b4cc4cbcc0be6e0ace3c9158805139db.tar.lz cuberite-63ded9f6b4cc4cbcc0be6e0ace3c9158805139db.tar.xz cuberite-63ded9f6b4cc4cbcc0be6e0ace3c9158805139db.tar.zst cuberite-63ded9f6b4cc4cbcc0be6e0ace3c9158805139db.zip |
-rw-r--r-- | src/Entities/Player.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index f5752ffb4..3b005d8eb 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -2075,6 +2075,7 @@ void cPlayer::UseEquippedItem(cItemHandler::eDurabilityLostAction a_Action) void cPlayer::UseItem(int a_SlotNumber, short a_Damage) { const cItem & Item = m_Inventory.GetSlot(a_SlotNumber); + if (Item.IsEmpty()) { return; @@ -2089,9 +2090,34 @@ void cPlayer::UseItem(int a_SlotNumber, short a_Damage) // Unbreaking is applied for each point of reduction. std::binomial_distribution<short> Dist(a_Damage, chance); short ReducedDamage = Dist(GetRandomProvider().Engine()); + if (m_Inventory.DamageItem(a_SlotNumber, ReducedDamage)) { - m_World->BroadcastSoundEffect("entity.item.break", GetPosition(), 0.5f, static_cast<float>(0.75 + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64)); + // The item broke. Broadcast the correct animation: + if (Item.m_ItemType == E_ITEM_SHIELD) + { + m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnShieldBreaks); + } + else if (a_SlotNumber == (cInventory::invHotbarOffset + m_Inventory.GetEquippedSlotNum())) + { + m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnMainHandEquipmentBreaks); + } + else + { + switch (a_SlotNumber) + { + case cInventory::invArmorOffset: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnHeadEquipmentBreaks); + case cInventory::invArmorOffset + 1: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnChestEquipmentBreaks); + case cInventory::invArmorOffset + 2: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnLegsEquipmentBreaks); + case cInventory::invArmorOffset + 3: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnFeetEquipmentBreaks); + case cInventory::invShieldOffset: return m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnOffHandEquipmentBreaks); + } + } + } + else if (Item.m_ItemType == E_ITEM_SHIELD) + { + // The item survived. Special case for shield blocking: + m_World->BroadcastEntityAnimation(*this, EntityAnimation::PawnShieldBlocks); } } |