diff options
-rw-r--r-- | src/Entities/Compoments/AIAggressiveComponent.h (renamed from src/Entities/Compoments/AIAgressiveComponent.h) | 13 | ||||
-rw-r--r-- | src/Entities/Compoments/AIAggresssiveComponent.cpp (renamed from src/Entities/Compoments/AIAgresssiveComponent.cpp) | 48 | ||||
-rw-r--r-- | src/Entities/Compoments/AIComponent.h | 2 |
3 files changed, 47 insertions, 16 deletions
diff --git a/src/Entities/Compoments/AIAgressiveComponent.h b/src/Entities/Compoments/AIAggressiveComponent.h index 2cd3f2304..a99fa2693 100644 --- a/src/Entities/Compoments/AIAgressiveComponent.h +++ b/src/Entities/Compoments/AIAggressiveComponent.h @@ -1,22 +1,25 @@ #pragma once #include "AIComponent.h" -class cAIAgressiveComponent : public cAIComponent { +class cAIAggressiveComponent : public cAIComponent { + typedef cAIComponent super; protected: enum MState{ATTACKING, IDLE, CHASING, ESCAPING} m_EMState; cEntity * m_Target; public: - cAIAgressiveComponent(cMonster * a_Monster) : cAIComponent(a_Monster), m_Target(null){} + cAIAggressiveComponent(cMonster * a_Monster) : cAIComponent(a_Monster), m_Target(NULL){} virtual void Tick(float a_Dt, cChunk & a_Chunk) override; virtual void InStateChasing(float a_Dt); - virtual void EventSeePlayer(cEntity *); virtual void Attack(float a_Dt); protected: - virtual void EventLosePlayer(void); virtual void CheckEventLostPlayer(void); + virtual void CheckEventSeePlayer(void); + virtual void EventLosePlayer(void); + virtual void EventSeePlayer(cEntity *); bool IsMovingToTargetPosition(); -}
\ No newline at end of file + bool ReachedFinalDestination(); +}; diff --git a/src/Entities/Compoments/AIAgresssiveComponent.cpp b/src/Entities/Compoments/AIAggresssiveComponent.cpp index 4dcd3e618..de8c8d2a9 100644 --- a/src/Entities/Compoments/AIAgresssiveComponent.cpp +++ b/src/Entities/Compoments/AIAggresssiveComponent.cpp @@ -1,4 +1,8 @@ -#include "AIAgressiveComponent.h" + +#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules +#include "AIAggressiveComponent.h" +#include "../Entities/Player.h" +#include "../Tracer.h" @@ -18,10 +22,10 @@ void cAIAggressiveComponent::Tick(float a_Dt, cChunk & a_Chunk) if (m_Target == NULL) return; - cTracer LineOfSight(GetWorld()); - Vector3d AttackDirection(m_Target->GetPosition() - GetPosition()); + cTracer LineOfSight(m_Self->GetWorld()); + Vector3d AttackDirection(m_Target->GetPosition() - m_Self->GetPosition()); - if (ReachedFinalDestination() && !LineOfSight.Trace(GetPosition(), AttackDirection, (int)AttackDirection.Length())) + if (ReachedFinalDestination() && !LineOfSight.Trace(m_Self->GetPosition(), AttackDirection, (int)AttackDirection.Length())) { // Attack if reached destination, target isn't null, and have a clear line of sight to target (so won't attack through walls) Attack(a_Dt / 1000); @@ -38,10 +42,10 @@ void cAIAggressiveComponent::Attack(float a_Dt) { // Setting this higher gives us more wiggle room for attackrate attack_interval = 0.0f; - m_Target->TakeDamage(dtMobAttack, m_Self, m_AttackDamage, 0); + m_Target->TakeDamage(dtMobAttack, m_Self, m_Self->GetAttackDamage(), 0); } - m_Self->SetAttackInterval(attack_interval) + m_Self->SetAttackInterval(attack_interval); } @@ -61,12 +65,37 @@ bool cAIAggressiveComponent::IsMovingToTargetPosition() } +bool cAIAggressiveComponent::ReachedFinalDestination() +{ + if ((m_Self->GetPosition() - m_Self->m_FinalDestination).Length() <= m_Self->GetAttackRange()) + { + return true; + } + + return false; +} + + /// Event Checkers +//Checks to see if EventSeePlayer should be fired +//monster sez: Do I see the player +void cAIAggressiveComponent::CheckEventSeePlayer(void) +{ + // TODO: Rewrite this to use cWorld's DoWithPlayers() + cPlayer * Closest = m_Self->GetWorld()->FindClosestPlayer(m_Self->GetPosition(), (float)m_Self->GetSightDistance(), false); + + if (Closest != NULL) + { + EventSeePlayer(Closest); + } +} + + void cAIAggressiveComponent::CheckEventLostPlayer(void) { if (m_Target != NULL) { - if ((m_Target->GetPosition() - GetPosition()).Length() > m_Self->GetSightDistance()) + if ((m_Target->GetPosition() - m_Self->GetPosition()).Length() > m_Self->GetSightDistance()) { EventLosePlayer(); } @@ -79,7 +108,7 @@ void cAIAggressiveComponent::CheckEventLostPlayer(void) /// Event Handlers -void cAggressiveMonster::EventSeePlayer(cEntity * a_Entity) +void cAIAggressiveComponent::EventSeePlayer(cEntity * a_Entity) { if (!((cPlayer *)a_Entity)->IsGameModeCreative()) { @@ -97,9 +126,8 @@ void cAIAggressiveComponent::EventLosePlayer(void) /// State Logic -void cAggressiveMonster::InStateChasing(float a_Dt) +void cAIAggressiveComponent::InStateChasing(float a_Dt) { - super::InStateChasing(a_Dt); if (m_Target != NULL) { diff --git a/src/Entities/Compoments/AIComponent.h b/src/Entities/Compoments/AIComponent.h index ac50a5a62..502516b85 100644 --- a/src/Entities/Compoments/AIComponent.h +++ b/src/Entities/Compoments/AIComponent.h @@ -7,7 +7,7 @@ class cAIComponent protected: cMonster * m_Self; public: - cAIComponent(cEntity * a_Entity) : m_Self(a_Entity){} + cAIComponent(cMonster * a_Entity) : m_Self(a_Entity){} virtual void Tick(float a_Dt, cChunk & a_Chunk){} }; |