summaryrefslogtreecommitdiffstats
path: root/src/Mobs/AggressiveMonster.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs/AggressiveMonster.cpp')
-rw-r--r--src/Mobs/AggressiveMonster.cpp98
1 files changed, 20 insertions, 78 deletions
diff --git a/src/Mobs/AggressiveMonster.cpp b/src/Mobs/AggressiveMonster.cpp
index fec14e6e9..0e6911305 100644
--- a/src/Mobs/AggressiveMonster.cpp
+++ b/src/Mobs/AggressiveMonster.cpp
@@ -5,9 +5,10 @@
#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"
@@ -15,95 +16,36 @@ cAggressiveMonster::cAggressiveMonster(const AString & a_ConfigName, eMonsterTyp
super(a_ConfigName, a_MobType, a_SoundHurt, a_SoundDeath, a_Width, a_Height)
{
m_EMPersonality = AGGRESSIVE;
+ ASSERT(GetBehaviorChaser() != nullptr);
}
-// What to do if in Chasing State
-void cAggressiveMonster::InStateChasing(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
-{
- super::InStateChasing(a_Dt, a_Chunk);
-
- if (GetTarget() != nullptr)
- {
- MoveToPosition(GetTarget()->GetPosition());
- }
-}
-
-
-
-
-
-
-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;
- }
+ /* cBehaviorChaser * BehaviorChaser = GetBehaviorChaser();
+ cBehaviorWanderer * BehaviorWanderer = GetBehaviorWanderer();
- // 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)
- )
+ for (;;)
{
- // 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);
- }
-}
-
-
+ m_BehaviorAggressive.Tick();
+ if (BehaviorChaser->Tick())
+ {
+ break;
+ }
+ if ((BehaviorWanderer != nullptr) && BehaviorWanderer->ActiveTick(a_Dt, a_Chunk))
+ {
+ break;
+ }
-
-
-bool cAggressiveMonster::Attack(std::chrono::milliseconds a_Dt)
-{
- if ((GetTarget() == nullptr) || (m_AttackCoolDownTicksLeft != 0))
- {
- return false;
+ ASSERT(!"Not a single Behavior took control, this is not normal. ");
+ break;
}
- // Setting this higher gives us more wiggle room for attackrate
- ResetAttackCooldown();
- GetTarget()->TakeDamage(dtMobAttack, this, m_AttackDamage, 0);
-
- return true;
+ BehaviorChaser->Tick();*/
}