summaryrefslogtreecommitdiffstats
path: root/src/Entities/ProjectileEntity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities/ProjectileEntity.cpp')
-rw-r--r--src/Entities/ProjectileEntity.cpp40
1 files changed, 24 insertions, 16 deletions
diff --git a/src/Entities/ProjectileEntity.cpp b/src/Entities/ProjectileEntity.cpp
index 13ebe31bc..c2a1f782d 100644
--- a/src/Entities/ProjectileEntity.cpp
+++ b/src/Entities/ProjectileEntity.cpp
@@ -126,7 +126,8 @@ protected:
////////////////////////////////////////////////////////////////////////////////
// cProjectileEntityCollisionCallback:
-class cProjectileEntityCollisionCallback
+class cProjectileEntityCollisionCallback :
+ public cEntityCallback
{
public:
cProjectileEntityCollisionCallback(cProjectileEntity * a_Projectile, const Vector3d & a_Pos, const Vector3d & a_NextPos) :
@@ -139,11 +140,11 @@ public:
}
- bool operator () (cEntity & a_Entity)
+ virtual bool Item(cEntity * a_Entity) override
{
if (
- (&a_Entity == m_Projectile) || // Do not check collisions with self
- (a_Entity.GetUniqueID() == m_Projectile->GetCreatorUniqueID()) // Do not check whoever shot the projectile
+ (a_Entity == m_Projectile) || // Do not check collisions with self
+ (a_Entity->GetUniqueID() == m_Projectile->GetCreatorUniqueID()) // Do not check whoever shot the projectile
)
{
// Don't check creator only for the first 5 ticks so that projectiles can collide with the creator
@@ -153,7 +154,7 @@ public:
}
}
- cBoundingBox EntBox(a_Entity.GetPosition(), a_Entity.GetWidth() / 2, a_Entity.GetHeight());
+ cBoundingBox EntBox(a_Entity->GetPosition(), a_Entity->GetWidth() / 2, a_Entity->GetHeight());
// Instead of colliding the bounding box with another bounding box in motion, we collide an enlarged bounding box with a hairline.
// The results should be good enough for our purposes
@@ -167,20 +168,20 @@ public:
}
if (
- !a_Entity.IsMob() &&
- !a_Entity.IsMinecart() &&
+ !a_Entity->IsMob() &&
+ !a_Entity->IsMinecart() &&
(
- !a_Entity.IsPlayer() ||
- static_cast<cPlayer &>(a_Entity).IsGameModeSpectator()
+ !a_Entity->IsPlayer() ||
+ static_cast<cPlayer *>(a_Entity)->IsGameModeSpectator()
) &&
- !a_Entity.IsBoat()
+ !a_Entity->IsBoat()
)
{
// Not an entity that interacts with a projectile
return false;
}
- if (cPluginManager::Get()->CallHookProjectileHitEntity(*m_Projectile, a_Entity))
+ if (cPluginManager::Get()->CallHookProjectileHitEntity(*m_Projectile, *a_Entity))
{
// A plugin disagreed.
return false;
@@ -190,7 +191,7 @@ public:
{
// The entity is closer than anything we've stored so far, replace it as the potential victim
m_MinCoeff = LineCoeff;
- m_HitEntity = &a_Entity;
+ m_HitEntity = a_Entity;
}
// Don't break the enumeration, we want all the entities
@@ -326,13 +327,20 @@ void cProjectileEntity::OnHitEntity(cEntity & a_EntityHit, const Vector3d & a_Hi
// If we were created by a player and we hit a pawn, notify attacking player's wolves
if (a_EntityHit.IsPawn() && (GetCreatorName() != ""))
{
- auto EntityHit = static_cast<cPawn *>(&a_EntityHit);
- m_World->DoWithEntityByID(GetCreatorUniqueID(), [=](cEntity & a_Hitter)
+ class cNotifyWolves : public cEntityCallback
+ {
+ public:
+ cPawn * m_EntityHit;
+
+ virtual bool Item(cEntity * a_Hitter) override
{
- static_cast<cPlayer&>(a_Hitter).NotifyNearbyWolves(EntityHit, true);
+ static_cast<cPlayer*>(a_Hitter)->NotifyNearbyWolves(m_EntityHit, true);
return true;
}
- );
+ } Callback;
+
+ Callback.m_EntityHit = static_cast<cPawn*>(&a_EntityHit);
+ m_World->DoWithEntityByID(GetCreatorUniqueID(), Callback);
}
}