summaryrefslogtreecommitdiffstats
path: root/src/Entities
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities')
-rw-r--r--src/Entities/Player.cpp43
-rw-r--r--src/Entities/Player.h9
2 files changed, 32 insertions, 20 deletions
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<int>(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<Int16>(a_Amount)))
+ if (GetInventory().DamageEquippedItem(a_Damage))
{
m_World->BroadcastSoundEffect("entity.item.break", GetPosition(), 0.5f, static_cast<float>(0.75 + (static_cast<float>((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);