summaryrefslogtreecommitdiffstats
path: root/src/Entities/ThrownEnderPearlEntity.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Entities/ThrownEnderPearlEntity.cpp')
-rw-r--r--src/Entities/ThrownEnderPearlEntity.cpp77
1 files changed, 20 insertions, 57 deletions
diff --git a/src/Entities/ThrownEnderPearlEntity.cpp b/src/Entities/ThrownEnderPearlEntity.cpp
index e6d708917..6fe4ce5be 100644
--- a/src/Entities/ThrownEnderPearlEntity.cpp
+++ b/src/Entities/ThrownEnderPearlEntity.cpp
@@ -9,22 +9,8 @@
cThrownEnderPearlEntity::cThrownEnderPearlEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):
- Super(pkEnderPearl, a_Creator, a_Pos, 0.25f, 0.25f),
- m_DestroyTimer(-1)
+ Super(pkEnderPearl, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f)
{
- SetSpeed(a_Speed);
-}
-
-
-
-
-
-void cThrownEnderPearlEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)
-{
- // TODO: Tweak a_HitPos based on block face.
- TeleportCreator(a_HitPos);
-
- m_DestroyTimer = 2;
}
@@ -33,51 +19,30 @@ void cThrownEnderPearlEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_Hi
void cThrownEnderPearlEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)
{
- int TotalDamage = 0;
-
- bool isAttachedEntity = GetWorld()->FindAndDoWithPlayer(m_CreatorData.m_Name, [& a_EntityHit](cPlayer & a_Entity)
- {
- const cEntity * attachedEntity = a_Entity.GetAttached();
- if (attachedEntity == nullptr)
- {
- // nothing attached
- return false;
- }
+ Super::OnHitEntity(a_EntityHit, a_HitPos);
- return attachedEntity->GetUniqueID() == a_EntityHit.GetUniqueID();
- }
- );
- // TODO: If entity is Ender Crystal, destroy it
-
-
- if (!isAttachedEntity)
+ int Damage = 0;
+ if (a_EntityHit.IsEnderCrystal())
{
- TeleportCreator(a_HitPos);
- a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1);
- m_DestroyTimer = 5;
+ // Endercrystals are destroyed:
+ Damage = CeilC(a_EntityHit.GetHealth());
}
+ a_EntityHit.TakeDamage(dtRangedAttack, this, Damage, 1);
+ TeleportCreator(a_HitPos);
+ Destroy();
}
-void cThrownEnderPearlEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
+void cThrownEnderPearlEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)
{
- if (m_DestroyTimer > 0)
- {
- m_DestroyTimer--;
- if (m_DestroyTimer == 0)
- {
- Destroy();
- return;
- }
- }
- else
- {
- Super::Tick(a_Dt, a_Chunk);
- }
+ Super::OnHitSolidBlock(a_HitPos, a_HitFace);
+
+ TeleportCreator(a_HitPos);
+ Destroy();
}
@@ -92,12 +57,10 @@ void cThrownEnderPearlEntity::TeleportCreator(Vector3d a_HitPos)
}
GetWorld()->FindAndDoWithPlayer(m_CreatorData.m_Name, [=](cPlayer & a_Entity)
- {
- // Teleport the creator here, make them take 5 damage:
- a_Entity.TeleportToCoords(a_HitPos.x, a_HitPos.y + 0.2, a_HitPos.z);
- a_Entity.TakeDamage(dtEnderPearl, this, 5, 0);
- a_Entity.Detach(true);
- return true;
- }
- );
+ {
+ // Teleport the creator here, make them take 5 damage:
+ a_Entity.TeleportToCoords(a_HitPos.x, a_HitPos.y + 0.2, a_HitPos.z);
+ a_Entity.TakeDamage(dtEnderPearl, this, 5, 0);
+ return false;
+ });
}