diff options
Diffstat (limited to '')
-rw-r--r-- | src/Entities/SplashPotionEntity.cpp | 67 |
1 files changed, 32 insertions, 35 deletions
diff --git a/src/Entities/SplashPotionEntity.cpp b/src/Entities/SplashPotionEntity.cpp index bf23b8ffb..dece6a1ea 100644 --- a/src/Entities/SplashPotionEntity.cpp +++ b/src/Entities/SplashPotionEntity.cpp @@ -17,11 +17,9 @@ cSplashPotionEntity::cSplashPotionEntity( Vector3d a_Speed, const cItem & a_Item ): - Super(pkSplashPotion, a_Creator, a_Pos, 0.25f, 0.25f), - m_Item(a_Item), - m_DestroyTimer(-1) + Super(pkSplashPotion, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f), + m_Item(a_Item) { - SetSpeed(a_Speed); m_EntityEffectType = cEntityEffect::GetPotionEffectType(a_Item.m_ItemDamage); m_EntityEffect = cEntityEffect( cEntityEffect::GetPotionEffectDuration(a_Item.m_ItemDamage), @@ -34,10 +32,30 @@ cSplashPotionEntity::cSplashPotionEntity( -void cSplashPotionEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) +void cSplashPotionEntity::Splash(Vector3d a_HitPos) { - Splash(a_HitPos); - m_DestroyTimer = 2; + // Look for entities in 8.25 (width) x 4.25 (height) cuboid _centred_ on hit position: + m_World->ForEachEntityInBox({ a_HitPos.addedY(-4.25 / 2), 8.25 / 2, 4.25 }, [this, a_HitPos](cEntity & a_Entity) + { + if (!a_Entity.IsPawn()) + { + // Not an entity that can take effects + return false; + } + + double SplashDistance = (a_Entity.GetPosition() - a_HitPos).Length(); + double Reduction = -0.25 * SplashDistance + 1.0; // y = -0.25x + 1, where x is the distance from the player. Approximation for potion splash. + Reduction = std::max(Reduction, 0.0); + + static_cast<cPawn &>(a_Entity).AddEntityEffect(m_EntityEffectType, m_EntityEffect.GetDuration(), m_EntityEffect.GetIntensity(), Reduction); + return false; + }); + + m_World->BroadcastSoundParticleEffect( + EffectID::PARTICLE_SPLASH_POTION, + a_HitPos.Floor(), + m_PotionColor + ); } @@ -46,42 +64,21 @@ void cSplashPotionEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFac void cSplashPotionEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) { + Super::OnHitEntity(a_EntityHit, a_HitPos); + a_EntityHit.TakeDamage(dtRangedAttack, this, 0, 1); Splash(a_HitPos); - m_DestroyTimer = 5; + Destroy(); } -void cSplashPotionEntity::Splash(Vector3d a_HitPos) +void cSplashPotionEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) { - double XZCalculation = 8.25/2; - double YCalculation = 4.25/2; - cBoundingBox SplashDistanceBox = cBoundingBox(a_HitPos.x - XZCalculation, a_HitPos.x + XZCalculation, a_HitPos.y - YCalculation, a_HitPos.y + YCalculation, a_HitPos.z - XZCalculation, a_HitPos.z + XZCalculation); - - m_World->ForEachEntityInBox(SplashDistanceBox, [=](cEntity & a_Entity) - { - if (!a_Entity.IsPawn()) - { - // Not an entity that can take effects - return false; - } - - // y = -0.25x + 1, where x is the distance from the player. Approximation for potion splash. - double SplashDistance = (a_Entity.GetPosition() - a_HitPos).Length(); - double Reduction = -0.25 * SplashDistance + 1.0; - Reduction = std::max(Reduction, 0.0); - - static_cast<cPawn &>(a_Entity).AddEntityEffect(m_EntityEffectType, m_EntityEffect.GetDuration(), m_EntityEffect.GetIntensity(), Reduction); - return false; - } - ); + Super::OnHitSolidBlock(a_HitPos, a_HitFace); - m_World->BroadcastSoundParticleEffect( - EffectID::PARTICLE_SPLASH_POTION, - a_HitPos.Floor(), - m_PotionColor - ); + Splash(a_HitPos); + Destroy(); } |