summaryrefslogtreecommitdiffstats
path: root/src/Entities/SplashPotionEntity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities/SplashPotionEntity.cpp')
-rw-r--r--src/Entities/SplashPotionEntity.cpp80
1 files changed, 24 insertions, 56 deletions
diff --git a/src/Entities/SplashPotionEntity.cpp b/src/Entities/SplashPotionEntity.cpp
index 8356806b3..15be9706e 100644
--- a/src/Entities/SplashPotionEntity.cpp
+++ b/src/Entities/SplashPotionEntity.cpp
@@ -17,60 +17,6 @@
////////////////////////////////////////////////////////////////////////////////
-// cSplashPotionEntityCallback:
-
-/** Used to distribute the splashed potion effect among nearby entities */
-class cSplashPotionCallback :
- public cEntityCallback
-{
-public:
- /** Creates the callback.
- @param a_HitPos The position where the splash potion has splashed
- @param a_EntityEffectType The effect type of the potion
- @param a_EntityEffect The effect description */
- cSplashPotionCallback(Vector3d a_HitPos, cEntityEffect::eType a_EntityEffectType, const cEntityEffect & a_EntityEffect) :
- m_HitPos(a_HitPos),
- m_EntityEffectType(a_EntityEffectType),
- m_EntityEffect(a_EntityEffect)
- {
- }
-
- /** Called by cWorld::ForEachEntity(), adds the stored entity effect to the entity, if it is close enough. */
- virtual bool Item(cEntity * a_Entity) override
- {
- if (!a_Entity->IsPawn())
- {
- // Not an entity that can take effects
- return false;
- }
-
- double SplashDistance = (a_Entity->GetPosition() - m_HitPos).Length();
- if (SplashDistance >= 20)
- {
- // Too far away
- return false;
- }
-
- // y = -0.25x + 1, where x is the distance from the player. Approximation for potion splash.
- // TODO: better equation
- 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;
- }
-
-private:
- Vector3d m_HitPos;
- cEntityEffect::eType m_EntityEffectType;
- const cEntityEffect & m_EntityEffect;
-};
-
-
-
-
-
-////////////////////////////////////////////////////////////////////////////////
// cSplashPotionEntity:
cSplashPotionEntity::cSplashPotionEntity(
@@ -119,8 +65,30 @@ void cSplashPotionEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)
void cSplashPotionEntity::Splash(Vector3d a_HitPos)
{
- cSplashPotionCallback Callback(a_HitPos, m_EntityEffectType, m_EntityEffect);
- m_World->ForEachEntity(Callback);
+ m_World->ForEachEntity([=](cEntity & a_Entity)
+ {
+ if (!a_Entity.IsPawn())
+ {
+ // Not an entity that can take effects
+ return false;
+ }
+
+ double SplashDistance = (a_Entity.GetPosition() - a_HitPos).Length();
+ if (SplashDistance >= 20)
+ {
+ // Too far away
+ return false;
+ }
+
+ // y = -0.25x + 1, where x is the distance from the player. Approximation for potion splash.
+ // TODO: better equation
+ 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;
+ }
+ );
m_World->BroadcastSoundParticleEffect(
EffectID::PARTICLE_SPLASH_POTION,