1
0

More Enchantments

- Added Thorns and Respiration enchantments
This commit is contained in:
Jaume Aloy 2014-08-22 11:49:49 +02:00
parent 19d1c976e7
commit 7d771953c0
2 changed files with 74 additions and 62 deletions

View File

@ -433,7 +433,6 @@ void cBlockHandler::DropBlock(cChunkInterface & a_ChunkInterface, cWorldInterfac
else else
{ {
// TODO: Add a proper overridable function for this // TODO: Add a proper overridable function for this
// Pickups.Add(m_BlockType, 1, Meta);
cEnchantments Enchantments = a_Digger->GetEquippedWeapon().m_Enchantments; cEnchantments Enchantments = a_Digger->GetEquippedWeapon().m_Enchantments;
if ((Enchantments.GetLevel(cEnchantments::enchSilkTouch) > 0) && a_Digger->IsPlayer()) if ((Enchantments.GetLevel(cEnchantments::enchSilkTouch) > 0) && a_Digger->IsPlayer())
{ {

View File

@ -357,8 +357,11 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
case cMonster::mtSilverfish: case cMonster::mtSilverfish:
{ {
a_TDI.RawDamage += 2.5 * BaneOfArthropodsLevel; a_TDI.RawDamage += 2.5 * BaneOfArthropodsLevel;
// TODO: Add slowness effect
break; break;
} };
default: break;
} }
} }
} }
@ -390,8 +393,27 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
default: StartBurning(BurnTicks * 20); default: StartBurning(BurnTicks * 20);
} }
} }
}
int ThornsLevel = 0;
cItem ArmorItems[] = { GetEquippedHelmet(), GetEquippedChestplate(), GetEquippedLeggings(), GetEquippedBoots() };
for (size_t i = 0; i < ARRAYCOUNT(ArmorItems); i++)
{
cItem Item = ArmorItems[i];
if (Item.m_Enchantments.GetLevel(cEnchantments::enchThorns) > ThornsLevel) ThornsLevel = Item.m_Enchantments.GetLevel(cEnchantments::enchThorns);
}
if (ThornsLevel > 0)
{
int Chance = ThornsLevel * 15;
cFastRandom Random;
int RandomValue = Random.GenerateRandomInteger(0, 100);
if (RandomValue <= Chance)
{
a_TDI.Attacker->TakeDamage(dtAttack, this, 0, Random.GenerateRandomInteger(1, 4), 0);
}
} }
if (!Player->IsOnGround()) if (!Player->IsOnGround())
@ -405,6 +427,7 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
Player->GetStatManager().AddValue(statDamageDealt, (StatValue)floor(a_TDI.FinalDamage * 10 + 0.5)); Player->GetStatManager().AddValue(statDamageDealt, (StatValue)floor(a_TDI.FinalDamage * 10 + 0.5));
} }
if (IsPlayer()){ if (IsPlayer()){
double TotalEPF = 0.0; double TotalEPF = 0.0;
double EPFProtection = 0.00; double EPFProtection = 0.00;
@ -413,65 +436,39 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
double EPFProjectileProtection = 0.00; double EPFProjectileProtection = 0.00;
double EPFFeatherFalling = 0.00; double EPFFeatherFalling = 0.00;
cEnchantments ChestplateEnchantments = GetEquippedChestplate().m_Enchantments; cItem ArmorItems[] = { GetEquippedHelmet(), GetEquippedChestplate(), GetEquippedLeggings(), GetEquippedBoots() };
cEnchantments LeggingsEnchantments = GetEquippedLeggings().m_Enchantments; for (size_t i = 0; i < ARRAYCOUNT(ArmorItems); i++)
cEnchantments BootsEnchantments = GetEquippedBoots().m_Enchantments;
cEnchantments HelmetEnchantments = GetEquippedHelmet().m_Enchantments;
if ((ChestplateEnchantments.GetLevel(cEnchantments::enchProtection) > 0) || (LeggingsEnchantments.GetLevel(cEnchantments::enchProtection) > 0)
|| (BootsEnchantments.GetLevel(cEnchantments::enchProtection) > 0) || (HelmetEnchantments.GetLevel(cEnchantments::enchProtection) > 0))
{ {
EPFProtection += (6 + pow(ChestplateEnchantments.GetLevel(cEnchantments::enchProtection), 2)) * 0.75 / 3; cItem Item = ArmorItems[i];
EPFProtection += (6 + pow(LeggingsEnchantments.GetLevel(cEnchantments::enchProtection), 2)) * 0.75 / 3; if (Item.m_Enchantments.GetLevel(cEnchantments::enchProtection) > 0)
EPFProtection += (6 + pow(BootsEnchantments.GetLevel(cEnchantments::enchProtection), 2)) * 0.75 / 3; {
EPFProtection += (6 + pow(HelmetEnchantments.GetLevel(cEnchantments::enchProtection), 2)) * 0.75 / 3; EPFProtection += (6 + pow(Item.m_Enchantments.GetLevel(cEnchantments::enchProtection), 2)) * 0.75 / 3;
}
if (Item.m_Enchantments.GetLevel(cEnchantments::enchFireProtection) > 0)
{
EPFFireProtection += (6 + pow(Item.m_Enchantments.GetLevel(cEnchantments::enchFireProtection), 2)) * 1.25 / 3;
}
if (Item.m_Enchantments.GetLevel(cEnchantments::enchFeatherFalling) > 0)
{
EPFFeatherFalling += (6 + pow(Item.m_Enchantments.GetLevel(cEnchantments::enchFeatherFalling), 2)) * 2.5 / 3;
}
if (Item.m_Enchantments.GetLevel(cEnchantments::enchBlastProtection) > 0)
{
EPFBlastProtection += (6 + pow(Item.m_Enchantments.GetLevel(cEnchantments::enchBlastProtection), 2)) * 1.5 / 3;
}
if (Item.m_Enchantments.GetLevel(cEnchantments::enchProjectileProtection) > 0)
{
EPFProjectileProtection += (6 + pow(Item.m_Enchantments.GetLevel(cEnchantments::enchProjectileProtection), 2)) * 1.5 / 3;
}
TotalEPF += EPFProtection;
} }
if ((ChestplateEnchantments.GetLevel(cEnchantments::enchFireProtection) > 0) || (LeggingsEnchantments.GetLevel(cEnchantments::enchFireProtection) > 0) TotalEPF = EPFProtection + EPFFireProtection + EPFFeatherFalling + EPFBlastProtection + EPFProjectileProtection;
|| (BootsEnchantments.GetLevel(cEnchantments::enchFireProtection) > 0) || (HelmetEnchantments.GetLevel(cEnchantments::enchFireProtection) > 0))
{
EPFFireProtection += (6 + pow(ChestplateEnchantments.GetLevel(cEnchantments::enchFireProtection), 2)) * 1.25 / 3;
EPFFireProtection += (6 + pow(LeggingsEnchantments.GetLevel(cEnchantments::enchFireProtection), 2)) * 1.25 / 3;
EPFFireProtection += (6 + pow(BootsEnchantments.GetLevel(cEnchantments::enchFireProtection), 2)) * 1.25 / 3;
EPFFireProtection += (6 + pow(HelmetEnchantments.GetLevel(cEnchantments::enchFireProtection), 2)) * 1.25 / 3;
TotalEPF += EPFFireProtection;
}
if ((ChestplateEnchantments.GetLevel(cEnchantments::enchFeatherFalling) > 0) || (LeggingsEnchantments.GetLevel(cEnchantments::enchFeatherFalling) > 0)
|| (BootsEnchantments.GetLevel(cEnchantments::enchFeatherFalling) > 0) || (HelmetEnchantments.GetLevel(cEnchantments::enchFeatherFalling) > 0))
{
EPFFeatherFalling += (6 + pow(ChestplateEnchantments.GetLevel(cEnchantments::enchFeatherFalling), 2)) * 2.5 / 3;
EPFFeatherFalling += (6 + pow(LeggingsEnchantments.GetLevel(cEnchantments::enchFeatherFalling), 2)) * 2.5 / 3;
EPFFeatherFalling += (6 + pow(BootsEnchantments.GetLevel(cEnchantments::enchFeatherFalling), 2)) * 2.5 / 3;
EPFFeatherFalling += (6 + pow(HelmetEnchantments.GetLevel(cEnchantments::enchFeatherFalling), 2)) * 2.5 / 3;
TotalEPF += EPFFeatherFalling;
}
if ((ChestplateEnchantments.GetLevel(cEnchantments::enchBlastProtection) > 0) || (LeggingsEnchantments.GetLevel(cEnchantments::enchBlastProtection) > 0)
|| (BootsEnchantments.GetLevel(cEnchantments::enchBlastProtection) > 0) || (HelmetEnchantments.GetLevel(cEnchantments::enchBlastProtection) > 0))
{
EPFBlastProtection += (6 + pow(ChestplateEnchantments.GetLevel(cEnchantments::enchBlastProtection), 2)) * 1.5 / 3;
EPFBlastProtection += (6 + pow(LeggingsEnchantments.GetLevel(cEnchantments::enchBlastProtection), 2)) * 1.5 / 3;
EPFBlastProtection += (6 + pow(BootsEnchantments.GetLevel(cEnchantments::enchBlastProtection), 2)) * 1.5 / 3;
EPFBlastProtection += (6 + pow(HelmetEnchantments.GetLevel(cEnchantments::enchBlastProtection), 2)) * 1.5 / 3;
TotalEPF += EPFBlastProtection;
}
if ((ChestplateEnchantments.GetLevel(cEnchantments::enchProjectileProtection) > 0) || (LeggingsEnchantments.GetLevel(cEnchantments::enchProjectileProtection) > 0)
|| (BootsEnchantments.GetLevel(cEnchantments::enchProjectileProtection) > 0) || (HelmetEnchantments.GetLevel(cEnchantments::enchProjectileProtection) > 0))
{
EPFProjectileProtection += (6 + pow(ChestplateEnchantments.GetLevel(cEnchantments::enchProjectileProtection), 2)) * 1.5 / 3;
EPFProjectileProtection += (6 + pow(LeggingsEnchantments.GetLevel(cEnchantments::enchProjectileProtection), 2)) * 1.5 / 3;
EPFProjectileProtection += (6 + pow(BootsEnchantments.GetLevel(cEnchantments::enchProjectileProtection), 2)) * 1.5 / 3;
EPFProjectileProtection += (6 + pow(HelmetEnchantments.GetLevel(cEnchantments::enchProjectileProtection), 2)) * 1.5 / 3;
TotalEPF += EPFProjectileProtection;
}
EPFProtection = EPFProtection / TotalEPF; EPFProtection = EPFProtection / TotalEPF;
EPFFireProtection = EPFFireProtection / TotalEPF; EPFFireProtection = EPFFireProtection / TotalEPF;
@ -482,10 +479,9 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
if (TotalEPF > 25) TotalEPF = 25; if (TotalEPF > 25) TotalEPF = 25;
cFastRandom Random; cFastRandom Random;
float randomvalue; float RandomValue = Random.GenerateRandomInteger(50, 100) * 0.01;
randomvalue = Random.GenerateRandomInteger(50, 100) * 0.01;
TotalEPF = ceil(TotalEPF * randomvalue); TotalEPF = ceil(TotalEPF * RandomValue);
if (TotalEPF > 20) TotalEPF = 20; if (TotalEPF > 20) TotalEPF = 20;
@ -507,9 +503,13 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
if (a_TDI.DamageType == dtProjectile) RemovedDamage += ceil(EPFBlastProtection * 0.04 * a_TDI.FinalDamage); if (a_TDI.DamageType == dtProjectile) RemovedDamage += ceil(EPFBlastProtection * 0.04 * a_TDI.FinalDamage);
if (a_TDI.FinalDamage < RemovedDamage) RemovedDamage = 0;
a_TDI.FinalDamage -= RemovedDamage; a_TDI.FinalDamage -= RemovedDamage;
} }
m_Health -= (short)a_TDI.FinalDamage; m_Health -= (short)a_TDI.FinalDamage;
// TODO: Apply damage to armor // TODO: Apply damage to armor
@ -533,7 +533,7 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
case 2: AdditionalSpeed.Set(8, 0.3, 8); break; case 2: AdditionalSpeed.Set(8, 0.3, 8); break;
default: break; default: break;
} }
SetSpeed(a_TDI.Knockback + AdditionalSpeed); AddSpeed(a_TDI.Knockback + AdditionalSpeed);
} }
m_World->BroadcastEntityStatus(*this, esGenericHurt); m_World->BroadcastEntityStatus(*this, esGenericHurt);
@ -1435,6 +1435,8 @@ void cEntity::HandleAir(void)
// See if the entity is /submerged/ water (block above is water) // See if the entity is /submerged/ water (block above is water)
// Get the type of block the entity is standing in: // Get the type of block the entity is standing in:
int RespirationLevel = GetEquippedHelmet().m_Enchantments.GetLevel(cEnchantments::enchRespiration);
if (IsSubmerged()) if (IsSubmerged())
{ {
if (!IsPlayer()) // Players control themselves if (!IsPlayer()) // Players control themselves
@ -1442,6 +1444,11 @@ void cEntity::HandleAir(void)
SetSpeedY(1); // Float in the water SetSpeedY(1); // Float in the water
} }
if (RespirationLevel > 0)
{
((cPawn *)this)->AddEntityEffect(cEntityEffect::effNightVision, 200, 5, 0);
}
if (m_AirLevel <= 0) if (m_AirLevel <= 0)
{ {
// Runs the air tick timer to check whether the player should be damaged // Runs the air tick timer to check whether the player should be damaged
@ -1468,6 +1475,12 @@ void cEntity::HandleAir(void)
// Set the air back to maximum // Set the air back to maximum
m_AirLevel = MAX_AIR_LEVEL; m_AirLevel = MAX_AIR_LEVEL;
m_AirTickTimer = DROWNING_TICKS; m_AirTickTimer = DROWNING_TICKS;
if (RespirationLevel > 0)
{
m_AirTickTimer = DROWNING_TICKS + (RespirationLevel * 15 * 20);
}
} }
} }