1
0

Skeleton, Ghast and Blaze's projectile code is now in their respective class.

This commit is contained in:
STRWarrior 2013-11-04 21:46:56 +01:00
parent 6f0f620cf8
commit 7cfcfc5f39
8 changed files with 91 additions and 68 deletions

View File

@ -44,7 +44,7 @@ void cAggressiveMonster::InStateChasing(float a_Dt)
Vector3f Their = Vector3f( m_Target->GetPosition() ); Vector3f Their = Vector3f( m_Target->GetPosition() );
if ((Their - Pos).Length() <= m_AttackRange) if ((Their - Pos).Length() <= m_AttackRange)
{ {
cMonster::Attack(a_Dt); Attack(a_Dt);
} }
MoveToPosition(Their + Vector3f(0, 0.65f, 0)); MoveToPosition(Their + Vector3f(0, 0.65f, 0));
} }

View File

@ -2,7 +2,7 @@
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "Blaze.h" #include "Blaze.h"
#include "../World.h"
@ -25,3 +25,28 @@ void cBlaze::GetDrops(cItems & a_Drops, cEntity * a_Killer)
void cBlaze::Attack(float a_Dt)
{
m_AttackInterval += a_Dt * m_AttackRate;
if (m_Target != NULL && m_AttackInterval > 3.0)
{
// Setting this higher gives us more wiggle room for attackrate
Vector3d Speed = GetLookVector() * 20;
Speed.y = Speed.y + 1;
cFireChargeEntity * FireCharge = new cFireChargeEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
if (FireCharge == NULL)
{
return;
}
if (!FireCharge->Initialize(m_World))
{
delete FireCharge;
return;
}
m_World->BroadcastSpawnEntity(*FireCharge);
m_AttackInterval = 0.0;
// ToDo: Shoot 3 fireballs instead of 1.
}
}

View File

@ -18,6 +18,7 @@ public:
CLASS_PROTODEF(cBlaze); CLASS_PROTODEF(cBlaze);
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void Attack(float a_Dt) override;
} ; } ;

View File

@ -2,7 +2,7 @@
#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
#include "Ghast.h" #include "Ghast.h"
#include "../World.h"
@ -25,3 +25,29 @@ void cGhast::GetDrops(cItems & a_Drops, cEntity * a_Killer)
void cGhast::Attack(float a_Dt)
{
m_AttackInterval += a_Dt * m_AttackRate;
if (m_Target != NULL && m_AttackInterval > 3.0)
{
// Setting this higher gives us more wiggle room for attackrate
Vector3d Speed = GetLookVector() * 20;
Speed.y = Speed.y + 1;
cGhastFireballEntity * GhastBall = new cGhastFireballEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
if (GhastBall == NULL)
{
return;
}
if (!GhastBall->Initialize(m_World))
{
delete GhastBall;
return;
}
m_World->BroadcastSpawnEntity(*GhastBall);
m_AttackInterval = 0.0;
}
}

View File

@ -18,6 +18,7 @@ public:
CLASS_PROTODEF(cGhast); CLASS_PROTODEF(cGhast);
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void Attack(float a_Dt) override;
bool IsCharging(void) const {return false; } bool IsCharging(void) const {return false; }
} ; } ;

View File

@ -440,70 +440,12 @@ void cMonster::InStateEscaping(float a_Dt)
void cMonster::Attack(float a_Dt) void cMonster::Attack(float a_Dt)
{ {
m_AttackInterval += a_Dt * m_AttackRate; m_AttackInterval += a_Dt * m_AttackRate;
if ((m_Target != NULL) && (m_AttackInterval > 3.0)) if ((m_Target != NULL) && (m_AttackInterval > 3.0))
// Setting this higher gives us more wiggle room for attackrate {
{ // Setting this higher gives us more wiggle room for attackrate
switch (GetMobType()) m_AttackInterval = 0.0;
{ ((cPawn *)m_Target)->TakeDamage(*this);
case mtSkeleton: }
{
Vector3d Speed = GetLookVector() * 20;
Speed.y = Speed.y + 1;
cArrowEntity * Arrow = new cArrowEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
if (Arrow == NULL)
{
return;
}
if (!Arrow->Initialize(m_World))
{
delete Arrow;
return;
}
m_World->BroadcastSpawnEntity(*Arrow);
break;
}
case mtGhast:
{
Vector3d Speed = GetLookVector() * 20;
Speed.y = Speed.y + 1;
cGhastFireballEntity * GhastBall = new cGhastFireballEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
if (GhastBall == NULL)
{
return;
}
if (!GhastBall->Initialize(m_World))
{
delete GhastBall;
return;
}
m_World->BroadcastSpawnEntity(*GhastBall);
break;
}
case mtBlaze:
{
Vector3d Speed = GetLookVector() * 20;
Speed.y = Speed.y + 1;
cFireChargeEntity * FireCharge = new cFireChargeEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
if (FireCharge == NULL)
{
return;
}
if (!FireCharge->Initialize(m_World))
{
delete FireCharge;
return;
}
m_World->BroadcastSpawnEntity(*FireCharge);
break;
// ToDo: Shoot 3 fireballs instead of 1.
}
default:
{
((cPawn *)m_Target)->TakeDamage(*this);
}
}
m_AttackInterval = 0.0;
}
} }

View File

@ -33,10 +33,37 @@ void cSkeleton::MoveToPosition(const Vector3f & a_Position)
m_Destination = a_Position; m_Destination = a_Position;
// If the destination is in the sun and if it is not night AND the skeleton isn't on fire then block the movement. // If the destination is in the sun and if it is not night AND the skeleton isn't on fire then block the movement.
if ((m_World->GetBlockSkyLight((int) a_Position.x, (int) a_Position.y, (int) a_Position.z) == 15) && (m_World->GetTimeOfDay() < 13187) && !IsOnFire()) if (!IsOnFire() && m_World->GetTimeOfDay() < 13187 && m_World->GetBlockSkyLight((int) a_Position.x, (int) a_Position.y, (int) a_Position.z) == 15)
{ {
m_bMovingToDestination = false; m_bMovingToDestination = false;
return; return;
} }
m_bMovingToDestination = true; m_bMovingToDestination = true;
}
void cSkeleton::Attack(float a_Dt)
{
m_AttackInterval += a_Dt * m_AttackRate;
if (m_Target != NULL && m_AttackInterval > 3.0)
{
// Setting this higher gives us more wiggle room for attackrate
Vector3d Speed = GetLookVector() * 20;
Speed.y = Speed.y + 1;
cArrowEntity * Arrow = new cArrowEntity(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
if (Arrow == NULL)
{
return;
}
if (!Arrow->Initialize(m_World))
{
delete Arrow;
return;
}
m_World->BroadcastSpawnEntity(*Arrow);
m_AttackInterval = 0.0;
}
} }

View File

@ -19,6 +19,7 @@ public:
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override; virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = NULL) override;
virtual void MoveToPosition(const Vector3f & a_Position) override; virtual void MoveToPosition(const Vector3f & a_Position) override;
virtual void Attack(float a_Dt) override;
bool IsWither(void) const { return m_bIsWither; }; bool IsWither(void) const { return m_bIsWither; };
private: private: