From b4aa19f329b06e42eb2591fc488b70dc0df41940 Mon Sep 17 00:00:00 2001 From: Alexander Harkness Date: Fri, 5 Jan 2018 11:28:06 +0000 Subject: Item durability loss now depends on the item used. (#4123) Armour durability also no longer changes when it is used to break blocks or attack mobs. Fixes #4119 --- src/Entities/Player.cpp | 43 ++++++++++++++++++++++++------------------- 1 file changed, 24 insertions(+), 19 deletions(-) (limited to 'src/Entities/Player.cpp') diff --git a/src/Entities/Player.cpp b/src/Entities/Player.cpp index 22f0655f2..71f7b582f 100644 --- a/src/Entities/Player.cpp +++ b/src/Entities/Player.cpp @@ -2330,35 +2330,25 @@ bool cPlayer::SaveToDisk() -void cPlayer::UseEquippedItem(int a_Amount) +void cPlayer::UseEquippedItem(short a_Damage) { - if (IsGameModeCreative() || IsGameModeSpectator()) // No damage in creative or spectator + // No durability loss in creative or spectator modes: + if (IsGameModeCreative() || IsGameModeSpectator()) { return; } - // If the item has an unbreaking enchantment, give it a random chance of not breaking: + // If the item has an unbreaking enchantment, give it a chance of escaping damage: + // Ref: https://minecraft.gamepedia.com/Enchanting#Unbreaking cItem Item = GetEquippedItem(); int UnbreakingLevel = static_cast(Item.m_Enchantments.GetLevel(cEnchantments::enchUnbreaking)); - if (UnbreakingLevel > 0) + double chance = 1 - (1.0 / (UnbreakingLevel + 1)); + if (GetRandomProvider().RandBool(chance)) { - double chance = 0.0; - if (ItemCategory::IsArmor(Item.m_ItemType)) - { - chance = 0.6 + (0.4 / (UnbreakingLevel + 1)); - } - else - { - chance = 1.0 / (UnbreakingLevel + 1); - } - - if (GetRandomProvider().RandBool(chance)) - { - return; - } + return; } - if (GetInventory().DamageEquippedItem(static_cast(a_Amount))) + if (GetInventory().DamageEquippedItem(a_Damage)) { m_World->BroadcastSoundEffect("entity.item.break", GetPosition(), 0.5f, static_cast(0.75 + (static_cast((GetUniqueID() * 23) % 32)) / 64)); } @@ -2368,6 +2358,21 @@ void cPlayer::UseEquippedItem(int a_Amount) +void cPlayer::UseEquippedItem(cItemHandler::eDurabilityLostAction a_Action) +{ + // Get item being used: + cItem Item = GetEquippedItem(); + + // Get base damage for action type: + short Dmg = cItemHandler::GetItemHandler(Item)->GetDurabilityLossByAction(a_Action); + + UseEquippedItem(Dmg); +} + + + + + void cPlayer::HandleFood(void) { // Ref.: https://minecraft.gamepedia.com/Hunger -- cgit v1.2.3