summaryrefslogtreecommitdiffstats
path: root/src/Entities
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Entities/Compoments/AIAgressiveComponent.h4
-rw-r--r--src/Entities/Compoments/AIAgresssiveComponent.cpp95
2 files changed, 97 insertions, 2 deletions
diff --git a/src/Entities/Compoments/AIAgressiveComponent.h b/src/Entities/Compoments/AIAgressiveComponent.h
index 338d311e3..2cd3f2304 100644
--- a/src/Entities/Compoments/AIAgressiveComponent.h
+++ b/src/Entities/Compoments/AIAgressiveComponent.h
@@ -3,6 +3,7 @@
class cAIAgressiveComponent : public cAIComponent {
protected:
+ enum MState{ATTACKING, IDLE, CHASING, ESCAPING} m_EMState;
cEntity * m_Target;
public:
cAIAgressiveComponent(cMonster * a_Monster) : cAIComponent(a_Monster), m_Target(null){}
@@ -14,5 +15,8 @@ public:
virtual void Attack(float a_Dt);
protected:
+ virtual void EventLosePlayer(void);
+ virtual void CheckEventLostPlayer(void);
+
bool IsMovingToTargetPosition();
} \ No newline at end of file
diff --git a/src/Entities/Compoments/AIAgresssiveComponent.cpp b/src/Entities/Compoments/AIAgresssiveComponent.cpp
index ae89ef5b9..4dcd3e618 100644
--- a/src/Entities/Compoments/AIAgresssiveComponent.cpp
+++ b/src/Entities/Compoments/AIAgresssiveComponent.cpp
@@ -1,5 +1,34 @@
#include "AIAgressiveComponent.h"
+
+
+void cAIAggressiveComponent::Tick(float a_Dt, cChunk & a_Chunk)
+{
+ super::Tick(a_Dt, a_Chunk);
+
+ if (m_EMState == CHASING)
+ {
+ CheckEventLostPlayer();
+ }
+ else
+ {
+ CheckEventSeePlayer();
+ }
+
+ if (m_Target == NULL)
+ return;
+
+ cTracer LineOfSight(GetWorld());
+ Vector3d AttackDirection(m_Target->GetPosition() - GetPosition());
+
+ if (ReachedFinalDestination() && !LineOfSight.Trace(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);
+ }
+}
+
+
void cAIAggressiveComponent::Attack(float a_Dt)
{
float attack_interval = m_Self->GetAttackInterval();
@@ -9,12 +38,13 @@ void cAIAggressiveComponent::Attack(float a_Dt)
{
// Setting this higher gives us more wiggle room for attackrate
attack_interval = 0.0f;
- m_Target->TakeDamage(dtMobAttack, this, m_AttackDamage, 0);
+ m_Target->TakeDamage(dtMobAttack, m_Self, m_AttackDamage, 0);
}
m_Self->SetAttackInterval(attack_interval)
}
+
bool cAIAggressiveComponent::IsMovingToTargetPosition()
{
// Difference between destination x and target x is negligible (to 10^-12 precision)
@@ -28,4 +58,65 @@ bool cAIAggressiveComponent::IsMovingToTargetPosition()
return false;
}
return true;
-} \ No newline at end of file
+}
+
+
+/// Event Checkers
+void cAIAggressiveComponent::CheckEventLostPlayer(void)
+{
+ if (m_Target != NULL)
+ {
+ if ((m_Target->GetPosition() - GetPosition()).Length() > m_Self->GetSightDistance())
+ {
+ EventLosePlayer();
+ }
+ }
+ else
+ {
+ EventLosePlayer();
+ }
+}
+
+
+/// Event Handlers
+void cAggressiveMonster::EventSeePlayer(cEntity * a_Entity)
+{
+ if (!((cPlayer *)a_Entity)->IsGameModeCreative())
+ {
+ m_Target = a_Entity;
+ m_EMState = CHASING;
+ }
+}
+
+
+void cAIAggressiveComponent::EventLosePlayer(void)
+{
+ m_Target = NULL;
+ m_EMState = IDLE;
+}
+
+
+/// State Logic
+void cAggressiveMonster::InStateChasing(float a_Dt)
+{
+ super::InStateChasing(a_Dt);
+
+ if (m_Target != NULL)
+ {
+ if (m_Target->IsPlayer())
+ {
+ if (((cPlayer *)m_Target)->IsGameModeCreative())
+ {
+ m_EMState = IDLE;
+ return;
+ }
+ }
+
+ if (!IsMovingToTargetPosition())
+ {
+ m_Self->MoveToPosition(m_Target->GetPosition());
+ }
+ }
+}
+
+