summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Skeleton.cpp
diff options
context:
space:
mode:
authorPersson-dev <66266021+Persson-dev@users.noreply.github.com>2021-12-29 20:30:09 +0100
committerGitHub <noreply@github.com>2021-12-29 20:30:09 +0100
commit1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a (patch)
tree798914afc59b513341a86cbb5bd0918333104595 /src/Mobs/Skeleton.cpp
parentImproved farmer AI & Fixed entity loading functions (#5351) (diff)
downloadcuberite-1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a.tar
cuberite-1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a.tar.gz
cuberite-1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a.tar.bz2
cuberite-1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a.tar.lz
cuberite-1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a.tar.xz
cuberite-1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a.tar.zst
cuberite-1edc6c8601f9d00751bf7c9f7fcc69d1e18bb46a.zip
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;
}