summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Mobs/AggressiveMonster.cpp118
-rw-r--r--src/Mobs/AggressiveMonster.h27
2 files changed, 38 insertions, 107 deletions
diff --git a/src/Mobs/AggressiveMonster.cpp b/src/Mobs/AggressiveMonster.cpp
index fec14e6e9..1cfec1849 100644
--- a/src/Mobs/AggressiveMonster.cpp
+++ b/src/Mobs/AggressiveMonster.cpp
@@ -5,31 +5,18 @@
#include "../World.h"
#include "../Entities/Player.h"
-#include "../LineBlockTracer.h"
+#include "../Tracer.h"
+#include "Behaviors/BehaviorAggressive.h"
+#include "Behaviors/BehaviorChaser.h"
+#include "Behaviors/BehaviorWanderer.h"
-
-
-cAggressiveMonster::cAggressiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height) :
- super(a_ConfigName, a_MobType, a_SoundHurt, a_SoundDeath, a_Width, a_Height)
-{
- m_EMPersonality = AGGRESSIVE;
-}
-
-
-
-
-
-// What to do if in Chasing State
-void cAggressiveMonster::InStateChasing(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
+cAggressiveMonster::cAggressiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height, int a_AggressionLightLevel) :
+ super(a_ConfigName, a_MobType, a_SoundHurt, a_SoundDeath, a_Width, a_Height), m_BehaviorAggressive(this, a_AggressionLightLevel)
{
- super::InStateChasing(a_Dt, a_Chunk);
-
- if (GetTarget() != nullptr)
- {
- MoveToPosition(GetTarget()->GetPosition());
- }
+ m_EMPersonality = AGGRESSIVE;
+ ASSERT(GetBehaviorChaser() != nullptr);
}
@@ -37,73 +24,28 @@ void cAggressiveMonster::InStateChasing(std::chrono::milliseconds a_Dt, cChunk &
-void cAggressiveMonster::EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk)
-{
- if (!a_Player->CanMobsTarget())
- {
- return;
- }
-
- super::EventSeePlayer(a_Player, a_Chunk);
- m_EMState = CHASING;
-}
-
-
-
-
-
void cAggressiveMonster::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_EMState == CHASING)
- {
- CheckEventLostPlayer();
- }
- else
- {
- CheckEventSeePlayer(a_Chunk);
- }
-
- auto target = GetTarget();
- if (target == nullptr)
- {
- return;
- }
-
- // TODO: Currently all mobs see through lava, but only Nether-native mobs should be able to.
- Vector3d MyHeadPosition = GetPosition() + Vector3d(0, GetHeight(), 0);
- Vector3d TargetPosition = target->GetPosition() + Vector3d(0, target->GetHeight(), 0);
- if (
- TargetIsInRange() &&
- cLineBlockTracer::LineOfSightTrace(*GetWorld(), MyHeadPosition, TargetPosition, cLineBlockTracer::losAirWaterLava) &&
- (GetHealth() > 0.0)
- )
- {
- // 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);
- }
-}
-
-
-
-
-
-bool cAggressiveMonster::Attack(std::chrono::milliseconds a_Dt)
-{
- if ((GetTarget() == nullptr) || (m_AttackCoolDownTicksLeft != 0))
- {
- return false;
- }
-
- // Setting this higher gives us more wiggle room for attackrate
- ResetAttackCooldown();
- GetTarget()->TakeDamage(dtMobAttack, this, m_AttackDamage, 0);
-
- return true;
+ super::Tick(a_Dt, a_Chunk);
+
+ cBehaviorChaser * BehaviorChaser = GetBehaviorChaser();
+ cBehaviorWanderer * BehaviorWanderer = GetBehaviorWanderer();
+
+ for (;;)
+ {
+ m_BehaviorAggressive.ActiveTick();
+ if (BehaviorChaser->ActiveTick())
+ {
+ break;
+ }
+ if ((BehaviorWanderer != nullptr) && BehaviorWanderer->ActiveTick(a_Dt, a_Chunk))
+ {
+ break;
+ }
+
+ ASSERT(!"Not a single Behavior took control, this is not normal. ");
+ break;
+ }
+
+ BehaviorChaser->Tick();
}
diff --git a/src/Mobs/AggressiveMonster.h b/src/Mobs/AggressiveMonster.h
index 9ab8df06f..1afcf846e 100644
--- a/src/Mobs/AggressiveMonster.h
+++ b/src/Mobs/AggressiveMonster.h
@@ -1,33 +1,22 @@
-
#pragma once
#include "Monster.h"
+#include "Behaviors/BehaviorAggressive.h"
-
-
+typedef std::string AString;
class cAggressiveMonster :
- public cMonster
+ public cMonster
{
- typedef cMonster super;
+ typedef cMonster super;
public:
- cAggressiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height);
-
- virtual void Tick (std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
- virtual void InStateChasing(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
-
+ cAggressiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height, int a_AggressionLightLevel);
- virtual void EventSeePlayer(cPlayer * a_Player, cChunk & a_Chunk) override;
+ virtual void Tick (std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
- /** Try to perform attack
- returns true if attack was deemed successful (hit player, fired projectile, creeper exploded, etc.) even if it didn't actually do damage
- return false if e.g. the mob is still in cooldown from a previous attack */
- virtual bool Attack(std::chrono::milliseconds a_Dt);
+private:
+ cBehaviorAggressive m_BehaviorAggressive;
} ;
-
-
-
-