summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormadmaxoft <github@xoft.cz>2013-09-03 08:37:15 +0200
committermadmaxoft <github@xoft.cz>2013-09-03 08:37:15 +0200
commit3a921955d94851b4f0148f69f3f0c35a227aa8f5 (patch)
tree7a19cc7ee486fc58f5f3a6739676d84b2878e27d
parentProjectiles slow down in water and lava. (diff)
downloadcuberite-3a921955d94851b4f0148f69f3f0c35a227aa8f5.tar
cuberite-3a921955d94851b4f0148f69f3f0c35a227aa8f5.tar.gz
cuberite-3a921955d94851b4f0148f69f3f0c35a227aa8f5.tar.bz2
cuberite-3a921955d94851b4f0148f69f3f0c35a227aa8f5.tar.lz
cuberite-3a921955d94851b4f0148f69f3f0c35a227aa8f5.tar.xz
cuberite-3a921955d94851b4f0148f69f3f0c35a227aa8f5.tar.zst
cuberite-3a921955d94851b4f0148f69f3f0c35a227aa8f5.zip
-rw-r--r--source/Entities/ProjectileEntity.cpp14
-rw-r--r--source/Entities/ProjectileEntity.h3
2 files changed, 13 insertions, 4 deletions
diff --git a/source/Entities/ProjectileEntity.cpp b/source/Entities/ProjectileEntity.cpp
index bef411559..c259cb52f 100644
--- a/source/Entities/ProjectileEntity.cpp
+++ b/source/Entities/ProjectileEntity.cpp
@@ -345,7 +345,8 @@ void cProjectileEntity::SpawnOn(cClientHandle & a_Client)
cArrowEntity::cArrowEntity(cEntity * a_Creator, double a_X, double a_Y, double a_Z, const Vector3d & a_Speed) :
super(pkArrow, a_Creator, a_X, a_Y, a_Z, 0.5, 0.5),
m_PickupState(psNoPickup),
- m_DamageCoeff(2)
+ m_DamageCoeff(2),
+ m_IsCritical(false)
{
SetSpeed(a_Speed);
SetMass(0.1);
@@ -361,7 +362,8 @@ cArrowEntity::cArrowEntity(cEntity * a_Creator, double a_X, double a_Y, double a
cArrowEntity::cArrowEntity(cPlayer & a_Player, double a_Force) :
super(pkArrow, &a_Player, a_Player.GetThrowStartPos(), a_Player.GetThrowSpeed(a_Force * 1.5 * 20), 0.5, 0.5),
m_PickupState(psInSurvivalOrCreative),
- m_DamageCoeff(2)
+ m_DamageCoeff(2),
+ m_IsCritical((a_Force >= 1))
{
}
@@ -401,8 +403,12 @@ void cArrowEntity::OnHitEntity(cEntity & a_EntityHit)
return;
}
- // TODO: The damage dealt should be based on arrow speed in addition to the damage coeff
- a_EntityHit.TakeDamage(dtRangedAttack, this, (int)(2.5 * m_DamageCoeff), 1);
+ int Damage = (int)(GetSpeed().Length() / 20 * m_DamageCoeff + 0.5);
+ if (m_IsCritical)
+ {
+ Damage += m_World->GetTickRandomNumber(Damage / 2 + 2);
+ }
+ a_EntityHit.TakeDamage(dtRangedAttack, this, Damage, 1);
Destroy();
}
diff --git a/source/Entities/ProjectileEntity.h b/source/Entities/ProjectileEntity.h
index da82c82ea..bd282d7e7 100644
--- a/source/Entities/ProjectileEntity.h
+++ b/source/Entities/ProjectileEntity.h
@@ -140,6 +140,9 @@ protected:
/// The coefficient applied to the damage that the arrow will deal, based on the bow enchantment. 2.0 for normal arrow
double m_DamageCoeff;
+
+ /// If true, the arrow deals more damage
+ bool m_IsCritical;
// cProjectileEntity overrides:
virtual void SpawnOn(cClientHandle & a_Client) override;