Skip to content

Commit

Permalink
Add skeleton bow pulling animation (#5355)
Browse files Browse the repository at this point in the history
* Added basic skeleton bow animation

* Fixing style
  • Loading branch information
Persson-dev committed Dec 29, 2021
1 parent fec64bb commit 1edc6c8
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 6 deletions.
37 changes: 36 additions & 1 deletion src/Mobs/Skeleton.cpp
Expand Up @@ -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)
{
}

Expand All @@ -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));
Expand All @@ -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;
}
Expand Down
8 changes: 8 additions & 0 deletions src/Mobs/Skeleton.h
Expand Up @@ -18,10 +18,18 @@ class cSkeleton:

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;

} ;
14 changes: 13 additions & 1 deletion src/Protocol/Protocol_1_10.cpp
Expand Up @@ -795,6 +795,19 @@ void cProtocol_1_10_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
break;
} // case mtSheep

case mtSkeleton:
{
auto & Skeleton = static_cast<const cSkeleton &>(a_Mob);
a_Pkt.WriteBEUInt8(LIVING_ACTIVE_HAND);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);
a_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);

a_Pkt.WriteBEUInt8(SKELETON_ARMS_SWINGING);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);
a_Pkt.WriteBool(Skeleton.IsChargingBow());
break;
} // case mtSkeleton

case mtSlime:
{
auto & Slime = static_cast<const cSlime &>(a_Mob);
Expand Down Expand Up @@ -958,7 +971,6 @@ void cProtocol_1_10_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
case mtIronGolem:
case mtMooshroom:
case mtSilverfish:
case mtSkeleton:
case mtSnowGolem:
case mtStray:
case mtSpider:
Expand Down
14 changes: 13 additions & 1 deletion src/Protocol/Protocol_1_11.cpp
Expand Up @@ -1102,6 +1102,19 @@ void cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
break;
} // case mtSheep

case mtSkeleton:
{
auto & Skeleton = static_cast<const cSkeleton &>(a_Mob);
a_Pkt.WriteBEUInt8(LIVING_ACTIVE_HAND);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);
a_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);

a_Pkt.WriteBEUInt8(ABSTRACT_SKELETON_ARMS_SWINGING);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);
a_Pkt.WriteBool(Skeleton.IsChargingBow());
break;
} // case mtSkeleton

case mtSlime:
{
auto & Slime = static_cast<const cSlime &>(a_Mob);
Expand Down Expand Up @@ -1260,7 +1273,6 @@ void cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
case mtIronGolem:
case mtMooshroom:
case mtSilverfish:
case mtSkeleton:
case mtStray:
case mtSpider:
case mtSquid:
Expand Down
14 changes: 13 additions & 1 deletion src/Protocol/Protocol_1_12.cpp
Expand Up @@ -788,6 +788,19 @@ void cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
break;
} // case mtSheep

case mtSkeleton:
{
auto & Skeleton = static_cast<const cSkeleton &>(a_Mob);
a_Pkt.WriteBEUInt8(LIVING_ACTIVE_HAND);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);
a_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);

a_Pkt.WriteBEUInt8(ABSTRACT_SKELETON_ARMS_SWINGING);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);
a_Pkt.WriteBool(Skeleton.IsChargingBow());
break;
} // case mtSkeleton

case mtSlime:
{
auto & Slime = static_cast<const cSlime &>(a_Mob);
Expand Down Expand Up @@ -967,7 +980,6 @@ void cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo

case mtGiant:
case mtSilverfish:
case mtSkeleton:
case mtSquid:
{
// Mobs with no extra fields
Expand Down
14 changes: 12 additions & 2 deletions src/Protocol/Protocol_1_13.cpp
Expand Up @@ -337,6 +337,7 @@ UInt8 cProtocol_1_13::GetEntityMetadataID(EntityMetadata a_Metadata) const
case EntityMetadata::IllagerFlags: return Insentient;
case EntityMetadata::SpeIlagerSpell: return Insentient + 1;
case EntityMetadata::VexFlags: return Insentient;
case EntityMetadata::AbstractSkeletonArmsSwinging: return Insentient;
case EntityMetadata::SpiderClimbing: return Insentient;
case EntityMetadata::WitchAggresive: return Insentient;
case EntityMetadata::WitherFirstHeadTarget: return Insentient;
Expand Down Expand Up @@ -366,7 +367,6 @@ UInt8 cProtocol_1_13::GetEntityMetadataID(EntityMetadata a_Metadata) const
case EntityMetadata::EntityPose:
case EntityMetadata::AreaEffectCloudParticleParameter1:
case EntityMetadata::AreaEffectCloudParticleParameter2:
case EntityMetadata::AbstractSkeletonArmsSwinging:
case EntityMetadata::ZombieUnusedWasType: break;
}
UNREACHABLE("Retrieved invalid metadata for protocol");
Expand Down Expand Up @@ -1184,6 +1184,17 @@ void cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
break;
} // case mtSheep

case mtSkeleton:
{
auto & Skeleton = static_cast<const cSkeleton &>(a_Mob);
WriteEntityMetadata(a_Pkt, EntityMetadata::LivingActiveHand, EntityMetadataType::Byte);
a_Pkt.WriteBEUInt8(Skeleton.IsChargingBow() ? 0x01 : 0x00);

WriteEntityMetadata(a_Pkt, EntityMetadata::AbstractSkeletonArmsSwinging, EntityMetadataType::Boolean);
a_Pkt.WriteBool(Skeleton.IsChargingBow());
break;
} // case mtSkeleton

case mtSlime:
{
auto & Slime = static_cast<const cSlime &>(a_Mob);
Expand Down Expand Up @@ -1354,7 +1365,6 @@ void cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo

case mtGiant:
case mtSilverfish:
case mtSkeleton:
case mtSquid:
case mtWitherSkeleton:
{
Expand Down
11 changes: 11 additions & 0 deletions src/Protocol/Protocol_1_9.cpp
Expand Up @@ -2110,9 +2110,20 @@ void cProtocol_1_9_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_M

case mtSkeleton:
{
auto & Skeleton = static_cast<const cSkeleton &>(a_Mob);
a_Pkt.WriteBEUInt8(11);
a_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);
a_Pkt.WriteVarInt32(0);

// Index 5 and 12 used for charging bow client animation.
a_Pkt.WriteBEUInt8(5);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);
a_Pkt.WriteBEInt8(0x02 | (Skeleton.IsChargingBow() ? 0x01 : 0x00));

a_Pkt.WriteBEUInt8(12);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BYTE);
a_Pkt.WriteBool(Skeleton.IsChargingBow());
break;
}

case mtSlime:
Expand Down

0 comments on commit 1edc6c8

Please sign in to comment.