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 ++++++++++++++++++++++++------------------- src/Entities/Player.h | 9 ++++++++- 2 files changed, 32 insertions(+), 20 deletions(-) (limited to 'src/Entities') 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 diff --git a/src/Entities/Player.h b/src/Entities/Player.h index f56841613..32a4b0348 100644 --- a/src/Entities/Player.h +++ b/src/Entities/Player.h @@ -5,6 +5,7 @@ #include "../Inventory.h" #include "../Defines.h" #include "../World.h" +#include "../Items/ItemHandler.h" #include "../Statistics.h" @@ -413,7 +414,13 @@ public: If the player is not riding a horse or if the horse is untamed, does nothing. */ void OpenHorseInventory(); - void UseEquippedItem(int a_Amount = 1); + /** Damage the player's equipped item by a_Damage, possibly less if the + equipped item is enchanted. */ + void UseEquippedItem(short a_Damage = 1); + + /** Damage the player's equipped item by the amount of damage such an item + is damaged by when used for a_Action */ + void UseEquippedItem(cItemHandler::eDurabilityLostAction a_Action); void SendHealth(void); -- cgit v1.2.3