summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Skeleton.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs/Skeleton.cpp')
-rw-r--r--src/Mobs/Skeleton.cpp37
1 files changed, 36 insertions, 1 deletions
diff --git a/src/Mobs/Skeleton.cpp b/src/Mobs/Skeleton.cpp
index a32d38d03..12081207f 100644
--- a/src/Mobs/Skeleton.cpp
+++ b/src/Mobs/Skeleton.cpp
@@ -10,7 +10,8 @@
cSkeleton::cSkeleton(void) :
- Super("Skeleton", mtSkeleton, "entity.skeleton.hurt", "entity.skeleton.death", "entity.skeleton.ambient", 0.6f, 1.99f)
+ Super("Skeleton", mtSkeleton, "entity.skeleton.hurt", "entity.skeleton.death", "entity.skeleton.ambient", 0.6f, 1.99f),
+ m_ChargingBow(false)
{
}
@@ -36,10 +37,40 @@ void cSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)
+void cSkeleton::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
+{
+ Super::Tick(a_Dt, a_Chunk);
+
+ if (!IsTicking())
+ {
+ // The base class tick destroyed us
+ return;
+ }
+
+ if (m_ChargingBow && (m_EMState == IDLE))
+ {
+ // releasing bow if no more target is found
+ m_ChargingBow = false;
+ m_World->BroadcastEntityMetadata(*this);
+ }
+}
+
+
+
+
+
bool cSkeleton::Attack(std::chrono::milliseconds a_Dt)
{
StopMovingToPosition(); // Todo handle this in a better way, the skeleton does some uneeded recalcs due to inStateChasing
auto & Random = GetRandomProvider();
+
+ if (!m_ChargingBow)
+ {
+ // updating pulling animation
+ m_ChargingBow = true;
+ m_World->BroadcastEntityMetadata(*this);
+ }
+
if ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))
{
Vector3d Inaccuracy = Vector3d(Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25));
@@ -53,6 +84,10 @@ bool cSkeleton::Attack(std::chrono::milliseconds a_Dt)
return false;
}
+ // releasing bow after arrow was shot
+ m_ChargingBow = false;
+ m_World->BroadcastEntityMetadata(*this);
+
ResetAttackCooldown();
return true;
}