summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLogicParrot <LogicParrot@users.noreply.github.com>2017-09-02 13:47:56 +0200
committerLogicParrot <LogicParrot@users.noreply.github.com>2017-09-02 13:47:56 +0200
commit0710995922546a904d5d018d2d5505017e24c0fc (patch)
tree101db7e8a701edfe965d9ee8a25cb9a3191cdcda /src
parentLambda revert fix (diff)
downloadcuberite-0710995922546a904d5d018d2d5505017e24c0fc.tar
cuberite-0710995922546a904d5d018d2d5505017e24c0fc.tar.gz
cuberite-0710995922546a904d5d018d2d5505017e24c0fc.tar.bz2
cuberite-0710995922546a904d5d018d2d5505017e24c0fc.tar.lz
cuberite-0710995922546a904d5d018d2d5505017e24c0fc.tar.xz
cuberite-0710995922546a904d5d018d2d5505017e24c0fc.tar.zst
cuberite-0710995922546a904d5d018d2d5505017e24c0fc.zip
Diffstat (limited to '')
-rw-r--r--src/Entities/Entity.cpp10
-rw-r--r--src/Entities/Entity.h2
-rw-r--r--src/Mobs/Behaviors/BehaviorAttacker.cpp41
-rw-r--r--src/Mobs/Behaviors/BehaviorAttacker.h4
4 files changed, 43 insertions, 14 deletions
diff --git a/src/Entities/Entity.cpp b/src/Entities/Entity.cpp
index 5f6b81497..9ac8d2e3c 100644
--- a/src/Entities/Entity.cpp
+++ b/src/Entities/Entity.cpp
@@ -406,6 +406,16 @@ void cEntity::SetPitchFromSpeed(void)
+const Vector3i cEntity::GetHeadPosition(void)
+{
+ int HeadHeight = CeilC(GetPosY() + GetHeight()) - 1;
+ return Vector3i(POSX_TOINT, HeadHeight, POSZ_TOINT);
+}
+
+
+
+
+
bool cEntity::DoTakeDamage(TakeDamageInfo & a_TDI)
{
if (m_Health <= 0)
diff --git a/src/Entities/Entity.h b/src/Entities/Entity.h
index f39039183..3a4898757 100644
--- a/src/Entities/Entity.h
+++ b/src/Entities/Entity.h
@@ -303,6 +303,8 @@ public:
/** Exported in ManualBindings */
const Vector3d & GetPosition(void) const { return m_Position; }
+ const Vector3i GetHeadPosition(void);
+
/** Exported in ManualBindings */
const Vector3d & GetSpeed(void) const { return m_Speed; }
diff --git a/src/Mobs/Behaviors/BehaviorAttacker.cpp b/src/Mobs/Behaviors/BehaviorAttacker.cpp
index 280914f09..2365ee3a3 100644
--- a/src/Mobs/Behaviors/BehaviorAttacker.cpp
+++ b/src/Mobs/Behaviors/BehaviorAttacker.cpp
@@ -55,6 +55,12 @@ void cBehaviorAttacker::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
UNUSED(a_Dt);
UNUSED(a_Chunk);
+ if (m_Parent->GetHealth() <= 0.0)
+ {
+ // mobTodo put this elsewhere?
+ return;
+ }
+
if (m_IsStriking)
{
if (StrikeTarget(++m_StrikeTickCnt))
@@ -91,13 +97,13 @@ void cBehaviorAttacker::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
if (GetTarget() != nullptr)
{
m_Parent->SetLookingAt(m_Target);
- if (TargetOutOfSight())
+ if (TargetTooFar())
{
SetTarget(nullptr);
}
else
{
- if (TargetIsInStrikeRadiusAndLineOfSight())
+ if (TargetIsInStrikeRadius() && TargetIsInLineOfSight())
{
m_Parent->StopMovingToPosition();
StrikeTargetIfReady();
@@ -216,6 +222,7 @@ void cBehaviorAttacker::StrikeTarget()
bool cBehaviorAttacker::TargetIsInStrikeRadius(void)
{
ASSERT(GetTarget() != nullptr);
+ ASSERT(m_Parent != nullptr);
return ((GetTarget()->GetPosition() - m_Parent->GetPosition()).SqrLength() < (m_AttackRange * m_AttackRange));
}
@@ -223,34 +230,44 @@ bool cBehaviorAttacker::TargetIsInStrikeRadius(void)
-bool cBehaviorAttacker::TargetIsInStrikeRadiusAndLineOfSight()
+bool cBehaviorAttacker::TargetIsInLineOfSight()
{
- ASSERT(m_Target != nullptr);
+ ASSERT(GetTarget() != nullptr);
ASSERT(m_Parent != nullptr);
+ // mobtodo make this smarter
+
cTracer LineOfSight(m_Parent->GetWorld());
- Vector3d MyHeadPosition = m_Parent->GetPosition() + Vector3d(0, m_Parent->GetHeight(), 0);
- Vector3d AttackDirection(GetTarget()->GetPosition() + Vector3d(0, GetTarget()->GetHeight(), 0) - MyHeadPosition);
+ Vector3d MyHeadPosition = m_Parent->GetHeadPosition();
+ Vector3d TargetHeadPosition = GetTarget()->GetHeadPosition();
+ Vector3d AttackDirection1(TargetHeadPosition - MyHeadPosition);
- if (TargetIsInStrikeRadius()/* &&
- !LineOfSight.Trace(MyHeadPosition, AttackDirection, static_cast<int>(AttackDirection.Length()))*/ &&
- (m_Parent->GetHealth() > 0.0)
+ if (LineOfSight.Trace(MyHeadPosition, AttackDirection1,
+ static_cast<int>(AttackDirection1.Length()))
)
{
- return true;
+ return false;
}
- else
+
+ Vector3d MyFeetPosition = m_Parent->GetPosition() + Vector3d(0, 0.5, 0);
+ Vector3d TargetFeetPosition = GetTarget()->GetPosition() + Vector3d(0, 0.5, 0);
+ Vector3d AttackDirection2(TargetFeetPosition - MyFeetPosition);
+ if (LineOfSight.Trace(MyFeetPosition, AttackDirection2,
+ static_cast<int>(AttackDirection2.Length()))
+ )
{
return false;
}
+
+ return true;
}
-bool cBehaviorAttacker::TargetOutOfSight()
+bool cBehaviorAttacker::TargetTooFar()
{
ASSERT(m_Target != nullptr);
if ((GetTarget()->GetPosition() - m_Parent->GetPosition()).Length() > m_Parent->GetSightDistance())
diff --git a/src/Mobs/Behaviors/BehaviorAttacker.h b/src/Mobs/Behaviors/BehaviorAttacker.h
index c047cde50..fe3805c66 100644
--- a/src/Mobs/Behaviors/BehaviorAttacker.h
+++ b/src/Mobs/Behaviors/BehaviorAttacker.h
@@ -52,8 +52,8 @@ protected:
// Target related methods
bool TargetIsInStrikeRadius();
- bool TargetIsInStrikeRadiusAndLineOfSight();
- bool TargetOutOfSight();
+ bool TargetIsInLineOfSight();
+ bool TargetTooFar();
void StrikeTargetIfReady(std::chrono::milliseconds a_Dt, cChunk & a_Chunk);
// Cooldown stuff