diff options
Diffstat (limited to '')
-rw-r--r-- | src/Mobs/Skeleton.cpp | 37 | ||||
-rw-r--r-- | src/Mobs/Skeleton.h | 8 |
2 files changed, 44 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; } diff --git a/src/Mobs/Skeleton.h b/src/Mobs/Skeleton.h index ee9c803c2..486bfe609 100644 --- a/src/Mobs/Skeleton.h +++ b/src/Mobs/Skeleton.h @@ -18,10 +18,18 @@ public: CLASS_PROTODEF(cSkeleton) + virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override; + virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override; virtual bool Attack(std::chrono::milliseconds a_Dt) override; virtual void SpawnOn(cClientHandle & a_ClientHandle) override; virtual bool IsUndead(void) override { return true; } + bool IsChargingBow() const { return m_ChargingBow; } + +private: + + bool m_ChargingBow; + } ; |