summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTiger Wang <ziwei.tiger@outlook.com>2021-04-10 00:19:50 +0200
committerTiger Wang <ziwei.tiger@outlook.com>2021-04-12 23:35:07 +0200
commit17c091a97f35ac4fceb6facea1b65588f498e3a0 (patch)
tree7a1e2eee7970abeb2794cc67b5b50497d9a9e1f1
parentImprove bed handling robustness (diff)
downloadcuberite-17c091a97f35ac4fceb6facea1b65588f498e3a0.tar
cuberite-17c091a97f35ac4fceb6facea1b65588f498e3a0.tar.gz
cuberite-17c091a97f35ac4fceb6facea1b65588f498e3a0.tar.bz2
cuberite-17c091a97f35ac4fceb6facea1b65588f498e3a0.tar.lz
cuberite-17c091a97f35ac4fceb6facea1b65588f498e3a0.tar.xz
cuberite-17c091a97f35ac4fceb6facea1b65588f498e3a0.tar.zst
cuberite-17c091a97f35ac4fceb6facea1b65588f498e3a0.zip
-rw-r--r--src/Entities/ThrownEggEntity.cpp65
-rw-r--r--src/Entities/ThrownEggEntity.h20
-rw-r--r--src/Entities/ThrownSnowballEntity.cpp58
-rw-r--r--src/Entities/ThrownSnowballEntity.h14
4 files changed, 48 insertions, 109 deletions
diff --git a/src/Entities/ThrownEggEntity.cpp b/src/Entities/ThrownEggEntity.cpp
index b8289b64b..44cfda937 100644
--- a/src/Entities/ThrownEggEntity.cpp
+++ b/src/Entities/ThrownEggEntity.cpp
@@ -8,21 +8,8 @@
cThrownEggEntity::cThrownEggEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):
- Super(pkEgg, a_Creator, a_Pos, 0.25f, 0.25f),
- m_DestroyTimer(-1)
+ Super(pkEgg, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f)
{
- SetSpeed(a_Speed);
-}
-
-
-
-
-
-void cThrownEggEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)
-{
- TrySpawnChicken(a_HitPos);
-
- m_DestroyTimer = 2;
}
@@ -31,41 +18,39 @@ void cThrownEggEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)
void cThrownEggEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos)
{
- int TotalDamage = 0;
- // If entity is an Ender Dragon or Ender Crystal, it is damaged.
- if (
- (a_EntityHit.IsMob() && (static_cast<cMonster &>(a_EntityHit).GetMobType() == mtEnderDragon)) ||
- a_EntityHit.IsEnderCrystal()
- )
+ Super::OnHitEntity(a_EntityHit, a_HitPos);
+
+ int Damage = 0;
+ if (a_EntityHit.IsMob() && (static_cast<cMonster &>(a_EntityHit).GetMobType() == mtEnderDragon))
{
- TotalDamage = 1;
+ // Enderdragons take 1 damage:
+ Damage = 1;
+ }
+ else if (a_EntityHit.IsEnderCrystal())
+ {
+ // Endercrystals are destroyed:
+ Damage = CeilC(a_EntityHit.GetHealth());
}
- TrySpawnChicken(a_HitPos);
- a_EntityHit.TakeDamage(dtRangedAttack, this, TotalDamage, 1);
+ a_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, 1);
+ m_World->BroadcastEntityAnimation(*this, EntityAnimation::EggCracks);
- m_DestroyTimer = 5;
+ TrySpawnChicken(a_HitPos);
+ Destroy();
}
-void cThrownEggEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
+void cThrownEggEntity::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);
+
+ m_World->BroadcastEntityAnimation(*this, EntityAnimation::EggCracks);
+
+ TrySpawnChicken(a_HitPos);
+ Destroy();
}
@@ -87,7 +72,3 @@ void cThrownEggEntity::TrySpawnChicken(Vector3d a_HitPos)
m_World->SpawnMob(a_HitPos.x, a_HitPos.y, a_HitPos.z, mtChicken, true);
}
}
-
-
-
-
diff --git a/src/Entities/ThrownEggEntity.h b/src/Entities/ThrownEggEntity.h
index f6240a680..f20705b81 100644
--- a/src/Entities/ThrownEggEntity.h
+++ b/src/Entities/ThrownEggEntity.h
@@ -30,23 +30,13 @@ public: // tolua_export
cThrownEggEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);
-protected:
-
- // cProjectileEntity overrides:
- virtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;
- virtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;
- virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
+private:
- // Randomly decides whether to spawn a chicken where the egg lands.
+ /** Randomly decides whether to spawn a chicken where the egg lands. */
void TrySpawnChicken(Vector3d a_HitPos);
-private:
-
- /** Time in ticks to wait for the hit animation to begin before destroying */
- int m_DestroyTimer;
+ // cProjectileEntity overrides:
+ virtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;
+ virtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;
} ; // tolua_export
-
-
-
-
diff --git a/src/Entities/ThrownSnowballEntity.cpp b/src/Entities/ThrownSnowballEntity.cpp
index 63068e69d..ab8a5f012 100644
--- a/src/Entities/ThrownSnowballEntity.cpp
+++ b/src/Entities/ThrownSnowballEntity.cpp
@@ -8,19 +8,8 @@
cThrownSnowballEntity::cThrownSnowballEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed):
- Super(pkSnowball, a_Creator, a_Pos, 0.25f, 0.25f),
- m_DestroyTimer(-1)
+ Super(pkSnowball, a_Creator, a_Pos, a_Speed, 0.25f, 0.25f)
{
- SetSpeed(a_Speed);
-}
-
-
-
-
-
-void cThrownSnowballEntity::OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace)
-{
- m_DestroyTimer = 2;
}
@@ -31,42 +20,31 @@ void cThrownSnowballEntity::OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos
{
Super::OnHitEntity(a_EntityHit, a_HitPos);
- int TotalDamage = 0;
- if (a_EntityHit.IsMob())
+ int Damage = 0;
+ if (a_EntityHit.IsMob() && (static_cast<cMonster &>(a_EntityHit).GetMobType() == mtBlaze))
+ {
+ // Blazes take 3 damage:
+ Damage = 3;
+ }
+ else if (a_EntityHit.IsEnderCrystal())
{
- eMonsterType MobType = static_cast<cMonster &>(a_EntityHit).GetMobType();
- if (MobType == mtBlaze)
- {
- TotalDamage = 3;
- }
+ // Endercrystals are destroyed:
+ Damage = CeilC(a_EntityHit.GetHealth());
}
- // TODO: If entity is Ender Crystal, destroy it
- a_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), TotalDamage, 1);
- m_DestroyTimer = 5;
+ a_EntityHit.TakeDamage(dtRangedAttack, GetCreatorUniqueID(), Damage, 1);
+ m_World->BroadcastEntityAnimation(*this, EntityAnimation::SnowballPoofs);
+ Destroy();
}
-void cThrownSnowballEntity::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
+void cThrownSnowballEntity::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);
+ m_World->BroadcastEntityAnimation(*this, EntityAnimation::SnowballPoofs);
+ Destroy();
+}
diff --git a/src/Entities/ThrownSnowballEntity.h b/src/Entities/ThrownSnowballEntity.h
index a4fcd3cb6..84dc394dd 100644
--- a/src/Entities/ThrownSnowballEntity.h
+++ b/src/Entities/ThrownSnowballEntity.h
@@ -30,20 +30,10 @@ public: // tolua_export
cThrownSnowballEntity(cEntity * a_Creator, Vector3d a_Pos, Vector3d a_Speed);
-protected:
+private:
// cProjectileEntity overrides:
- virtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;
virtual void OnHitEntity(cEntity & a_EntityHit, Vector3d a_HitPos) override;
- virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
-
-private:
-
- /** Time in ticks to wait for the hit animation to begin before destroying */
- int m_DestroyTimer;
+ virtual void OnHitSolidBlock(Vector3d a_HitPos, eBlockFace a_HitFace) override;
} ; // tolua_export
-
-
-
-