Merge pull request #2615 from Gargaj/cavespider-attack
Fix cavespider poisoning even if attack is in cooldown
This commit is contained in:
commit
a1926ca16e
@ -92,15 +92,17 @@ void cAggressiveMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cAggressiveMonster::Attack(std::chrono::milliseconds a_Dt)
|
bool cAggressiveMonster::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
||||||
if ((m_Target == nullptr) || (m_AttackInterval < 3.0))
|
if ((m_Target == nullptr) || (m_AttackInterval < 3.0))
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Setting this higher gives us more wiggle room for attackrate
|
// Setting this higher gives us more wiggle room for attackrate
|
||||||
m_AttackInterval = 0.0;
|
m_AttackInterval = 0.0;
|
||||||
m_Target->TakeDamage(dtMobAttack, this, m_AttackDamage, 0);
|
m_Target->TakeDamage(dtMobAttack, this, m_AttackDamage, 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ public:
|
|||||||
virtual void InStateChasing(std::chrono::milliseconds a_Dt) override;
|
virtual void InStateChasing(std::chrono::milliseconds a_Dt) override;
|
||||||
|
|
||||||
virtual void EventSeePlayer(cEntity *) override;
|
virtual void EventSeePlayer(cEntity *) override;
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt);
|
virtual bool Attack(std::chrono::milliseconds a_Dt);
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ void cBlaze::GetDrops(cItems & a_Drops, cEntity * a_Killer)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cBlaze::Attack(std::chrono::milliseconds a_Dt)
|
bool cBlaze::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
||||||
|
|
||||||
@ -44,16 +44,18 @@ void cBlaze::Attack(std::chrono::milliseconds a_Dt)
|
|||||||
cFireChargeEntity * FireCharge = new cFireChargeEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
|
cFireChargeEntity * FireCharge = new cFireChargeEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
|
||||||
if (FireCharge == nullptr)
|
if (FireCharge == nullptr)
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if (!FireCharge->Initialize(*m_World))
|
if (!FireCharge->Initialize(*m_World))
|
||||||
{
|
{
|
||||||
delete FireCharge;
|
delete FireCharge;
|
||||||
FireCharge = nullptr;
|
FireCharge = nullptr;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
m_World->BroadcastSpawnEntity(*FireCharge);
|
m_World->BroadcastSpawnEntity(*FireCharge);
|
||||||
m_AttackInterval = 0.0;
|
m_AttackInterval = 0.0;
|
||||||
// ToDo: Shoot 3 fireballs instead of 1.
|
// ToDo: Shoot 3 fireballs instead of 1.
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -18,5 +18,5 @@ public:
|
|||||||
CLASS_PROTODEF(cBlaze)
|
CLASS_PROTODEF(cBlaze)
|
||||||
|
|
||||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt) override;
|
virtual bool Attack(std::chrono::milliseconds a_Dt) override;
|
||||||
} ;
|
} ;
|
||||||
|
@ -27,15 +27,19 @@ void cCaveSpider::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cCaveSpider::Attack(std::chrono::milliseconds a_Dt)
|
bool cCaveSpider::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
super::Attack(a_Dt);
|
if (!super::Attack(a_Dt))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_Target->IsPawn())
|
if (m_Target->IsPawn())
|
||||||
{
|
{
|
||||||
// TODO: Easy = no poison, Medium = 7 seconds, Hard = 15 seconds
|
// TODO: Easy = no poison, Medium = 7 seconds, Hard = 15 seconds
|
||||||
static_cast<cPawn *>(m_Target)->AddEntityEffect(cEntityEffect::effPoison, 7 * 20, 0);
|
static_cast<cPawn *>(m_Target)->AddEntityEffect(cEntityEffect::effPoison, 7 * 20, 0);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ public:
|
|||||||
CLASS_PROTODEF(cCaveSpider)
|
CLASS_PROTODEF(cCaveSpider)
|
||||||
|
|
||||||
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt) override;
|
virtual bool Attack(std::chrono::milliseconds a_Dt) override;
|
||||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
||||||
} ;
|
} ;
|
||||||
|
|
||||||
|
@ -121,7 +121,7 @@ bool cCreeper::DoTakeDamage(TakeDamageInfo & a_TDI)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cCreeper::Attack(std::chrono::milliseconds a_Dt)
|
bool cCreeper::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
UNUSED(a_Dt);
|
UNUSED(a_Dt);
|
||||||
|
|
||||||
@ -130,7 +130,10 @@ void cCreeper::Attack(std::chrono::milliseconds a_Dt)
|
|||||||
m_World->BroadcastSoundEffect("game.tnt.primed", GetPosX(), GetPosY(), GetPosZ(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));
|
m_World->BroadcastSoundEffect("game.tnt.primed", GetPosX(), GetPosY(), GetPosZ(), 1.f, (0.75f + (static_cast<float>((GetUniqueID() * 23) % 32)) / 64));
|
||||||
m_bIsBlowing = true;
|
m_bIsBlowing = true;
|
||||||
m_World->BroadcastEntityMetadata(*this);
|
m_World->BroadcastEntityMetadata(*this);
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ public:
|
|||||||
|
|
||||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
||||||
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
|
virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt) override;
|
virtual bool Attack(std::chrono::milliseconds a_Dt) override;
|
||||||
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
||||||
virtual void OnRightClicked(cPlayer & a_Player) override;
|
virtual void OnRightClicked(cPlayer & a_Player) override;
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ void cGhast::GetDrops(cItems & a_Drops, cEntity * a_Killer)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cGhast::Attack(std::chrono::milliseconds a_Dt)
|
bool cGhast::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
||||||
|
|
||||||
@ -44,17 +44,20 @@ void cGhast::Attack(std::chrono::milliseconds a_Dt)
|
|||||||
cGhastFireballEntity * GhastBall = new cGhastFireballEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
|
cGhastFireballEntity * GhastBall = new cGhastFireballEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
|
||||||
if (GhastBall == nullptr)
|
if (GhastBall == nullptr)
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if (!GhastBall->Initialize(*m_World))
|
if (!GhastBall->Initialize(*m_World))
|
||||||
{
|
{
|
||||||
delete GhastBall;
|
delete GhastBall;
|
||||||
GhastBall = nullptr;
|
GhastBall = nullptr;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
m_World->BroadcastSpawnEntity(*GhastBall);
|
m_World->BroadcastSpawnEntity(*GhastBall);
|
||||||
m_AttackInterval = 0.0;
|
m_AttackInterval = 0.0;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ public:
|
|||||||
CLASS_PROTODEF(cGhast)
|
CLASS_PROTODEF(cGhast)
|
||||||
|
|
||||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt) override;
|
virtual bool Attack(std::chrono::milliseconds a_Dt) override;
|
||||||
|
|
||||||
bool IsCharging(void) const {return false; }
|
bool IsCharging(void) const {return false; }
|
||||||
} ;
|
} ;
|
||||||
|
@ -48,7 +48,7 @@ void cSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cSkeleton::Attack(std::chrono::milliseconds a_Dt)
|
bool cSkeleton::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
cFastRandom Random;
|
cFastRandom Random;
|
||||||
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
m_AttackInterval += (static_cast<float>(a_Dt.count()) / 1000) * m_AttackRate;
|
||||||
@ -60,17 +60,20 @@ void cSkeleton::Attack(std::chrono::milliseconds a_Dt)
|
|||||||
cArrowEntity * Arrow = new cArrowEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
|
cArrowEntity * Arrow = new cArrowEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
|
||||||
if (Arrow == nullptr)
|
if (Arrow == nullptr)
|
||||||
{
|
{
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
if (!Arrow->Initialize(*m_World))
|
if (!Arrow->Initialize(*m_World))
|
||||||
{
|
{
|
||||||
delete Arrow;
|
delete Arrow;
|
||||||
Arrow = nullptr;
|
Arrow = nullptr;
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
m_World->BroadcastSpawnEntity(*Arrow);
|
m_World->BroadcastSpawnEntity(*Arrow);
|
||||||
m_AttackInterval = 0.0;
|
m_AttackInterval = 0.0;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,7 +18,7 @@ public:
|
|||||||
CLASS_PROTODEF(cSkeleton)
|
CLASS_PROTODEF(cSkeleton)
|
||||||
|
|
||||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt) override;
|
virtual bool Attack(std::chrono::milliseconds a_Dt) override;
|
||||||
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
|
||||||
|
|
||||||
virtual bool IsUndead(void) override { return true; }
|
virtual bool IsUndead(void) override { return true; }
|
||||||
|
@ -46,13 +46,15 @@ void cSlime::GetDrops(cItems & a_Drops, cEntity * a_Killer)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cSlime::Attack(std::chrono::milliseconds a_Dt)
|
bool cSlime::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
if (m_Size > 1)
|
if (m_Size > 1)
|
||||||
{
|
{
|
||||||
// Only slimes larger than size 1 attack a player.
|
// Only slimes larger than size 1 attack a player.
|
||||||
super::Attack(a_Dt);
|
return super::Attack(a_Dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ public:
|
|||||||
|
|
||||||
// cAggressiveMonster overrides:
|
// cAggressiveMonster overrides:
|
||||||
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt) override;
|
virtual bool Attack(std::chrono::milliseconds a_Dt) override;
|
||||||
virtual void KilledBy(TakeDamageInfo & a_TDI) override;
|
virtual void KilledBy(TakeDamageInfo & a_TDI) override;
|
||||||
|
|
||||||
int GetSize(void) const { return m_Size; }
|
int GetSize(void) const { return m_Size; }
|
||||||
|
@ -45,7 +45,7 @@ bool cWolf::DoTakeDamage(TakeDamageInfo & a_TDI)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWolf::Attack(std::chrono::milliseconds a_Dt)
|
bool cWolf::Attack(std::chrono::milliseconds a_Dt)
|
||||||
{
|
{
|
||||||
UNUSED(a_Dt);
|
UNUSED(a_Dt);
|
||||||
|
|
||||||
@ -53,13 +53,15 @@ void cWolf::Attack(std::chrono::milliseconds a_Dt)
|
|||||||
{
|
{
|
||||||
if (static_cast<cPlayer *>(m_Target)->GetName() != m_OwnerName)
|
if (static_cast<cPlayer *>(m_Target)->GetName() != m_OwnerName)
|
||||||
{
|
{
|
||||||
super::Attack(a_Dt);
|
return super::Attack(a_Dt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
super::Attack(a_Dt);
|
return super::Attack(a_Dt);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ public:
|
|||||||
virtual void OnRightClicked(cPlayer & a_Player) override;
|
virtual void OnRightClicked(cPlayer & a_Player) override;
|
||||||
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
|
||||||
virtual void TickFollowPlayer();
|
virtual void TickFollowPlayer();
|
||||||
virtual void Attack(std::chrono::milliseconds a_Dt) override;
|
virtual bool Attack(std::chrono::milliseconds a_Dt) override;
|
||||||
|
|
||||||
// Get functions
|
// Get functions
|
||||||
bool IsSitting (void) const override { return m_IsSitting; }
|
bool IsSitting (void) const override { return m_IsSitting; }
|
||||||
|
Loading…
Reference in New Issue
Block a user