1
0

Improvements to knockback (#4504)

* Improvements to knockback
* SetSpeed for explosions
* Improve code consistency
This commit is contained in:
Mat 2020-03-19 19:13:41 +02:00 committed by GitHub
parent 683d24faad
commit 0e07e231a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 14 deletions

View File

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

View File

@ -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())
{ {

View File

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

View File

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

View File

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