Improvements to knockback (#4504)
* Improvements to knockback * SetSpeed for explosions * Improve code consistency
This commit is contained in:
parent
683d24faad
commit
0e07e231a2
@ -1319,7 +1319,7 @@ void cChunkMap::DoExplosionAt(double a_ExplosionSize, double a_BlockX, double a_
|
|||||||
DistanceFromExplosion.Normalize();
|
DistanceFromExplosion.Normalize();
|
||||||
DistanceFromExplosion *= Impact;
|
DistanceFromExplosion *= Impact;
|
||||||
|
|
||||||
a_Entity.AddSpeed(DistanceFromExplosion);
|
a_Entity.SetSpeed(DistanceFromExplosion);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -115,9 +115,13 @@ void cArrowEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)
|
|||||||
Damage += ExtraDamage;
|
Damage += ExtraDamage;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Knockback = 10;
|
||||||
|
|
||||||
unsigned int PunchLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPunch);
|
unsigned int PunchLevel = m_CreatorData.m_Enchantments.GetLevel(cEnchantments::enchPunch);
|
||||||
double KnockbackAmount = 11 + 10 * PunchLevel;
|
unsigned int PunchLevelMultiplier = 8;
|
||||||
a_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, KnockbackAmount);
|
|
||||||
|
Knockback += PunchLevelMultiplier * PunchLevel;
|
||||||
|
a_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, Knockback);
|
||||||
|
|
||||||
if (IsOnFire() && !a_EntityHit.IsInWater())
|
if (IsOnFire() && !a_EntityHit.IsInWater())
|
||||||
{
|
{
|
||||||
|
@ -344,7 +344,17 @@ void cEntity::TakeDamage(eDamageType a_DamageType, cEntity * a_Attacker, int a_R
|
|||||||
Heading = a_Attacker->GetLookVector();
|
Heading = a_Attacker->GetLookVector();
|
||||||
}
|
}
|
||||||
|
|
||||||
TDI.Knockback = Heading * a_KnockbackAmount;
|
int KnockbackHeight = 3;
|
||||||
|
|
||||||
|
if (IsPlayer())
|
||||||
|
{
|
||||||
|
KnockbackHeight = 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply slight height to knockback
|
||||||
|
Vector3d FinalKnockback = Vector3d(Heading.x * a_KnockbackAmount, Heading.y + KnockbackHeight, Heading.z * a_KnockbackAmount);
|
||||||
|
|
||||||
|
TDI.Knockback = FinalKnockback;
|
||||||
DoTakeDamage(TDI);
|
DoTakeDamage(TDI);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,7 +545,7 @@ bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
|
|||||||
// Add knockback:
|
// Add knockback:
|
||||||
if ((IsMob() || IsPlayer()) && (a_TDI.Attacker != nullptr))
|
if ((IsMob() || IsPlayer()) && (a_TDI.Attacker != nullptr))
|
||||||
{
|
{
|
||||||
AddSpeed(a_TDI.Knockback);
|
SetSpeed(a_TDI.Knockback);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_World->BroadcastEntityStatus(*this, esGenericHurt);
|
m_World->BroadcastEntityStatus(*this, esGenericHurt);
|
||||||
@ -772,18 +782,20 @@ int cEntity::GetArmorCoverAgainst(const cEntity * a_Attacker, eDamageType a_Dama
|
|||||||
|
|
||||||
double cEntity::GetKnockbackAmountAgainst(const cEntity & a_Receiver)
|
double cEntity::GetKnockbackAmountAgainst(const cEntity & a_Receiver)
|
||||||
{
|
{
|
||||||
// Returns the knockback amount that the currently equipped items would cause to a_Receiver on a hit
|
// Default knockback for entities
|
||||||
double Knockback = 11;
|
double Knockback = 10;
|
||||||
|
|
||||||
// If we're sprinting, bump up the knockback
|
// If we're sprinting, bump up the knockback
|
||||||
if (IsSprinting())
|
if (IsSprinting())
|
||||||
{
|
{
|
||||||
Knockback = 16;
|
Knockback = 15;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Check for knockback enchantments (punch only applies to shot arrows)
|
// Check for knockback enchantments (punch only applies to shot arrows)
|
||||||
unsigned int KnockbackLevel = GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchKnockback);
|
unsigned int KnockbackLevel = GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchKnockback);
|
||||||
Knockback += 10 * KnockbackLevel;
|
unsigned int KnockbackLevelMultiplier = 8;
|
||||||
|
|
||||||
|
Knockback += KnockbackLevelMultiplier * KnockbackLevel;
|
||||||
|
|
||||||
return Knockback;
|
return Knockback;
|
||||||
}
|
}
|
||||||
|
@ -1000,10 +1000,6 @@ void cPlayer::ApplyArmorDamage(int a_DamageBlocked)
|
|||||||
|
|
||||||
bool cPlayer::DoTakeDamage(TakeDamageInfo & a_TDI)
|
bool cPlayer::DoTakeDamage(TakeDamageInfo & a_TDI)
|
||||||
{
|
{
|
||||||
SetSpeed(0, 0, 0);
|
|
||||||
// Prevents knocking the player in the wrong direction due to
|
|
||||||
// the speed vector problems, see #2865
|
|
||||||
// In the future, the speed vector should be fixed
|
|
||||||
if ((a_TDI.DamageType != dtInVoid) && (a_TDI.DamageType != dtPlugin))
|
if ((a_TDI.DamageType != dtInVoid) && (a_TDI.DamageType != dtPlugin))
|
||||||
{
|
{
|
||||||
if (IsGameModeCreative() || IsGameModeSpectator())
|
if (IsGameModeCreative() || IsGameModeSpectator())
|
||||||
|
@ -102,7 +102,9 @@ bool cAggressiveMonster::Attack(std::chrono::milliseconds a_Dt)
|
|||||||
|
|
||||||
// Setting this higher gives us more wiggle room for attackrate
|
// Setting this higher gives us more wiggle room for attackrate
|
||||||
ResetAttackCooldown();
|
ResetAttackCooldown();
|
||||||
GetTarget()->TakeDamage(dtMobAttack, this, m_AttackDamage, 0);
|
|
||||||
|
double KnockbackAmount = 9;
|
||||||
|
GetTarget()->TakeDamage(dtMobAttack, this, m_AttackDamage, KnockbackAmount);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user