1
0

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
This commit is contained in:
Alexander Harkness
2018-01-05 11:28:06 +00:00
committed by GitHub
parent 757231cc6e
commit b4aa19f329
30 changed files with 111 additions and 208 deletions

View File

@@ -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