summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/Mobs/Behaviors/BehaviorAggressive.cpp5
-rw-r--r--src/Mobs/Behaviors/BehaviorAttacker.cpp11
-rw-r--r--src/Mobs/Behaviors/BehaviorAttacker.h3
-rw-r--r--src/Mobs/Behaviors/BehaviorAttackerMelee.h2
-rw-r--r--src/Mobs/Behaviors/BehaviorBreeder.cpp1
-rw-r--r--src/Mobs/Behaviors/BehaviorDayLightBurner.h4
-rw-r--r--src/Mobs/Blaze.cpp55
-rw-r--r--src/Mobs/Blaze.h17
-rw-r--r--src/Mobs/CMakeLists.txt2
-rw-r--r--src/Mobs/CaveSpider.cpp61
-rw-r--r--src/Mobs/CaveSpider.h14
-rw-r--r--src/Mobs/Chicken.cpp1
-rw-r--r--src/Mobs/Cow.cpp18
-rw-r--r--src/Mobs/Cow.h3
-rw-r--r--src/Mobs/Creeper.cpp1
-rw-r--r--src/Mobs/Creeper.h28
-rw-r--r--src/Mobs/EnderDragon.cpp1
-rw-r--r--src/Mobs/EnderDragon.h10
-rw-r--r--src/Mobs/Enderman.cpp1
-rw-r--r--src/Mobs/Enderman.h36
-rw-r--r--src/Mobs/Ghast.cpp51
-rw-r--r--src/Mobs/Ghast.h16
-rw-r--r--src/Mobs/Giant.cpp2
-rw-r--r--src/Mobs/Giant.h6
-rw-r--r--src/Mobs/Guardian.cpp1
-rw-r--r--src/Mobs/Guardian.h6
-rw-r--r--src/Mobs/Horse.cpp18
-rw-r--r--src/Mobs/Horse.h3
-rw-r--r--src/Mobs/IronGolem.cpp1
-rw-r--r--src/Mobs/IronGolem.h6
-rw-r--r--src/Mobs/MagmaCube.cpp1
-rw-r--r--src/Mobs/MagmaCube.h6
-rw-r--r--src/Mobs/MobPointer.cpp2
-rw-r--r--src/Mobs/MobPointer.h2
-rw-r--r--src/Mobs/Monster.cpp32
-rw-r--r--src/Mobs/Monster.h9
-rw-r--r--src/Mobs/Mooshroom.cpp18
-rw-r--r--src/Mobs/Mooshroom.h3
-rw-r--r--src/Mobs/PassiveAggressiveMonster.cpp16
-rw-r--r--src/Mobs/PassiveAggressiveMonster.h21
-rw-r--r--src/Mobs/Pig.cpp21
-rw-r--r--src/Mobs/Pig.h2
-rw-r--r--src/Mobs/Rabbit.cpp18
-rw-r--r--src/Mobs/Rabbit.h3
-rw-r--r--src/Mobs/Sheep.cpp18
-rw-r--r--src/Mobs/Sheep.h2
-rw-r--r--src/Mobs/Silverfish.h16
-rw-r--r--src/Mobs/Skeleton.cpp88
-rw-r--r--src/Mobs/Skeleton.h22
-rw-r--r--src/Mobs/Slime.cpp1
-rw-r--r--src/Mobs/Slime.h35
-rw-r--r--src/Mobs/SnowGolem.cpp1
-rw-r--r--src/Mobs/SnowGolem.h6
-rw-r--r--src/Mobs/Spider.cpp1
-rw-r--r--src/Mobs/Spider.h14
-rw-r--r--src/Mobs/Witch.cpp1
-rw-r--r--src/Mobs/Witch.h6
-rw-r--r--src/Mobs/Wither.cpp1
-rw-r--r--src/Mobs/Wither.h6
-rw-r--r--src/Mobs/Wolf.cpp1
-rw-r--r--src/Mobs/Wolf.h2
-rw-r--r--src/Mobs/Zombie.cpp41
-rw-r--r--src/Mobs/Zombie.h15
-rw-r--r--src/Mobs/ZombiePigman.cpp1
-rw-r--r--src/Mobs/ZombiePigman.h6
65 files changed, 340 insertions, 482 deletions
diff --git a/src/Mobs/Behaviors/BehaviorAggressive.cpp b/src/Mobs/Behaviors/BehaviorAggressive.cpp
index b55c1b476..2e3333e89 100644
--- a/src/Mobs/Behaviors/BehaviorAggressive.cpp
+++ b/src/Mobs/Behaviors/BehaviorAggressive.cpp
@@ -34,6 +34,9 @@ void cBehaviorAggressive::PreTick(std::chrono::milliseconds a_Dt, cChunk & a_Chu
cPawn * cBehaviorAggressive::FindNewTarget()
{
cPlayer * Closest = m_Parent->GetNearestPlayer();
- if (!Closest->CanMobsTarget()) return nullptr;
+ if ((Closest != nullptr) && (!Closest->CanMobsTarget()))
+ {
+ return nullptr;
+ }
return Closest; // May be null
}
diff --git a/src/Mobs/Behaviors/BehaviorAttacker.cpp b/src/Mobs/Behaviors/BehaviorAttacker.cpp
index 00eb53179..67a27a277 100644
--- a/src/Mobs/Behaviors/BehaviorAttacker.cpp
+++ b/src/Mobs/Behaviors/BehaviorAttacker.cpp
@@ -16,6 +16,7 @@ cBehaviorAttacker::cBehaviorAttacker() :
, m_AttackCoolDownTicksLeft(0)
, m_TicksSinceLastDamaged(100)
, m_IsStriking(false)
+ , m_Target(nullptr)
{
}
@@ -24,13 +25,14 @@ cBehaviorAttacker::cBehaviorAttacker() :
-void cBehaviorAttacker::AttachToMonster(cMonster & a_Parent, cBehaviorStriker & a_ParentStriker)
+void cBehaviorAttacker::AttachToMonster(cMonster & a_Parent)
{
m_Parent = &a_Parent;
m_Parent->AttachTickBehavior(this);
m_Parent->AttachDestroyBehavior(this);
m_Parent->AttachPostTickBehavior(this);
m_Parent->AttachDoTakeDamageBehavior(this);
+ m_Parent->m_BehaviorAttackerPointer = this;
}
@@ -90,6 +92,7 @@ void cBehaviorAttacker::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
ASSERT((GetTarget() == nullptr) || (GetTarget()->IsPawn() && (GetTarget()->GetWorld() == m_Parent->GetWorld())));
if (GetTarget() != nullptr)
{
+ m_Parent->SetLookingAt(m_Target);
if (TargetOutOfSight())
{
SetTarget(nullptr);
@@ -237,8 +240,8 @@ bool cBehaviorAttacker::TargetIsInStrikeRadiusAndLineOfSight()
Vector3d MyHeadPosition = m_Parent->GetPosition() + Vector3d(0, m_Parent->GetHeight(), 0);
Vector3d AttackDirection(GetTarget()->GetPosition() + Vector3d(0, GetTarget()->GetHeight(), 0) - MyHeadPosition);
- if (TargetIsInStrikeRadius() &&
- !LineOfSight.Trace(MyHeadPosition, AttackDirection, static_cast<int>(AttackDirection.Length())) &&
+ if (TargetIsInStrikeRadius()/* &&
+ !LineOfSight.Trace(MyHeadPosition, AttackDirection, static_cast<int>(AttackDirection.Length()))*/ &&
(m_Parent->GetHealth() > 0.0)
)
{
@@ -279,7 +282,7 @@ void cBehaviorAttacker::ResetStrikeCooldown()
void cBehaviorAttacker::StrikeTargetIfReady()
{
- if (m_AttackCoolDownTicksLeft != 0)
+ if (m_AttackCoolDownTicksLeft == 0)
{
StrikeTarget();
}
diff --git a/src/Mobs/Behaviors/BehaviorAttacker.h b/src/Mobs/Behaviors/BehaviorAttacker.h
index 4d99fda21..78ed70994 100644
--- a/src/Mobs/Behaviors/BehaviorAttacker.h
+++ b/src/Mobs/Behaviors/BehaviorAttacker.h
@@ -3,7 +3,6 @@
class cBehaviorAttacker;
#include "Behavior.h"
-class cBehaviorStriker;
/** Grants attack capability to the mob. Note that this is not the same as agression!
@@ -15,7 +14,7 @@ class cBehaviorAttacker : public cBehavior
public:
cBehaviorAttacker();
- void AttachToMonster(cMonster & a_Parent, cBehaviorStriker & a_ParentStriker);
+ void AttachToMonster(cMonster & a_Parent);
// Our host monster will call these once it loads its config file
diff --git a/src/Mobs/Behaviors/BehaviorAttackerMelee.h b/src/Mobs/Behaviors/BehaviorAttackerMelee.h
index 49a51ff71..b079c94fc 100644
--- a/src/Mobs/Behaviors/BehaviorAttackerMelee.h
+++ b/src/Mobs/Behaviors/BehaviorAttackerMelee.h
@@ -4,7 +4,7 @@
/** Makes the mob fight back any other mob that damages it. Mob should have BehaviorAttacker to work.
This behavior does not make sense in combination with BehaviorCoward. */
-class cBehaviorAttackerMelee : cBehaviorAttacker
+class cBehaviorAttackerMelee : public cBehaviorAttacker
{
public:
bool StrikeTarget(int a_StrikeTickCnt) override;
diff --git a/src/Mobs/Behaviors/BehaviorBreeder.cpp b/src/Mobs/Behaviors/BehaviorBreeder.cpp
index d06a3cb96..7ede92c52 100644
--- a/src/Mobs/Behaviors/BehaviorBreeder.cpp
+++ b/src/Mobs/Behaviors/BehaviorBreeder.cpp
@@ -26,6 +26,7 @@ void cBehaviorBreeder::AttachToMonster(cMonster & a_Parent)
m_Parent->AttachPostTickBehavior(this);
m_Parent->AttachRightClickBehavior(this);
m_Parent->AttachDestroyBehavior(this);
+ m_Parent->m_BehaviorBreederPointer = this;
}
diff --git a/src/Mobs/Behaviors/BehaviorDayLightBurner.h b/src/Mobs/Behaviors/BehaviorDayLightBurner.h
index 780827910..07812b9db 100644
--- a/src/Mobs/Behaviors/BehaviorDayLightBurner.h
+++ b/src/Mobs/Behaviors/BehaviorDayLightBurner.h
@@ -8,13 +8,9 @@ class cBehaviorDayLightBurner : cBehavior
{
public:
void AttachToMonster(cMonster & a_Parent);
-
void PostTick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
bool WouldBurnAt(Vector3d a_Location, cChunk & a_Chunk);
- // Functions our host Monster should invoke:
- void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
-
private:
cMonster * m_Parent; // Our Parent
cEntity * m_Attacker; // The entity we're running away from
diff --git a/src/Mobs/Blaze.cpp b/src/Mobs/Blaze.cpp
index 7ada21369..df54be1fd 100644
--- a/src/Mobs/Blaze.cpp
+++ b/src/Mobs/Blaze.cpp
@@ -9,10 +9,11 @@
cBlaze::cBlaze(void) :
- super("Blaze", mtBlaze, "entity.blaze.hurt", "entity.blaze.death", 0.6, 1.8)
+ super("Blaze", mtBlaze, "entity.blaze.hurt", "entity.blaze.death", 0.6, 1.8)
{
- SetGravity(-8.0f);
- SetAirDrag(0.05f);
+ m_EMPersonality = AGGRESSIVE;
+ SetGravity(-8.0f);
+ SetAirDrag(0.05f);
}
@@ -21,11 +22,11 @@ cBlaze::cBlaze(void) :
void cBlaze::GetDrops(cItems & a_Drops, cEntity * a_Killer)
{
- if ((a_Killer != nullptr) && (a_Killer->IsPlayer() || a_Killer->IsA("cWolf")))
- {
- unsigned int LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
- AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_BLAZE_ROD);
- }
+ if ((a_Killer != nullptr) && (a_Killer->IsPlayer() || a_Killer->IsA("cWolf")))
+ {
+ unsigned int LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
+ AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_BLAZE_ROD);
+ }
}
@@ -35,23 +36,23 @@ void cBlaze::GetDrops(cItems & a_Drops, cEntity * a_Killer)
/*
bool cBlaze::Attack(std::chrono::milliseconds a_Dt)
{
- if ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))
- {
- // Setting this higher gives us more wiggle room for attackrate
- Vector3d Speed = GetLookVector() * 20;
- Speed.y = Speed.y + 1;
-
- auto FireCharge = cpp14::make_unique<cFireChargeEntity>(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
- auto FireChargePtr = FireCharge.get();
- if (!FireChargePtr->Initialize(std::move(FireCharge), *m_World))
- {
- return false;
- }
-
- ResetAttackCooldown();
- // ToDo: Shoot 3 fireballs instead of 1.
-
- return true;
- }
- return false;
+ if ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))
+ {
+ // Setting this higher gives us more wiggle room for attackrate
+ Vector3d Speed = GetLookVector() * 20;
+ Speed.y = Speed.y + 1;
+
+ auto FireCharge = cpp14::make_unique<cFireChargeEntity>(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
+ auto FireChargePtr = FireCharge.get();
+ if (!FireChargePtr->Initialize(std::move(FireCharge), *m_World))
+ {
+ return false;
+ }
+
+ ResetAttackCooldown();
+ // ToDo: Shoot 3 fireballs instead of 1.
+
+ return true;
+ }
+ return false;
}*/
diff --git a/src/Mobs/Blaze.h b/src/Mobs/Blaze.h
index 7e389fa6c..1fb165a37 100644
--- a/src/Mobs/Blaze.h
+++ b/src/Mobs/Blaze.h
@@ -1,21 +1,16 @@
-
#pragma once
-#include "AggressiveMonster.h"
-
-
-
-
+#include "Monster.h"
class cBlaze :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- cBlaze(void);
+ cBlaze(void);
- CLASS_PROTODEF(cBlaze)
+ CLASS_PROTODEF(cBlaze)
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
} ;
diff --git a/src/Mobs/CMakeLists.txt b/src/Mobs/CMakeLists.txt
index 27eb92e7d..51d9cd630 100644
--- a/src/Mobs/CMakeLists.txt
+++ b/src/Mobs/CMakeLists.txt
@@ -20,7 +20,6 @@ SET (SRCS
Monster.cpp
Mooshroom.cpp
Ocelot.cpp
- PassiveAggressiveMonster.cpp
Path.cpp
PathFinder.cpp
Pig.cpp
@@ -59,7 +58,6 @@ SET (HDRS
MonsterTypes.h
Mooshroom.h
Ocelot.h
- PassiveAggressiveMonster.h
Path.h
PathFinder.h
Pig.h
diff --git a/src/Mobs/CaveSpider.cpp b/src/Mobs/CaveSpider.cpp
index 8d8e15d85..0e33282c0 100644
--- a/src/Mobs/CaveSpider.cpp
+++ b/src/Mobs/CaveSpider.cpp
@@ -8,8 +8,9 @@
cCaveSpider::cCaveSpider(void) :
- super("CaveSpider", mtCaveSpider, "entity.spider.hurt", "entity.spider.death", 0.7, 0.5)
+ super("CaveSpider", mtCaveSpider, "entity.spider.hurt", "entity.spider.death", 0.7, 0.5)
{
+ m_EMPersonality = AGGRESSIVE;
}
@@ -18,14 +19,14 @@ cCaveSpider::cCaveSpider(void) :
void cCaveSpider::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
{
- super::Tick(a_Dt, a_Chunk);
- if (!IsTicking())
- {
- // The base class tick destroyed us
- return;
- }
-
- m_EMPersonality = (GetWorld()->GetTimeOfDay() < (12000 + 1000)) ? PASSIVE : AGGRESSIVE;
+ super::Tick(a_Dt, a_Chunk);
+ if (!IsTicking())
+ {
+ // The base class tick destroyed us
+ return;
+ }
+
+ m_EMPersonality = (GetWorld()->GetTimeOfDay() < (12000 + 1000)) ? PASSIVE : AGGRESSIVE;
}
@@ -34,17 +35,17 @@ void cCaveSpider::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
/*
bool cCaveSpider::Attack(std::chrono::milliseconds a_Dt)
{
- if (!super::Attack(a_Dt))
- {
- return false;
- }
-
- if (GetTarget()->IsPawn())
- {
- // TODO: Easy = no poison, Medium = 7 seconds, Hard = 15 seconds
- static_cast<cPawn *>(GetTarget())->AddEntityEffect(cEntityEffect::effPoison, 7 * 20, 0);
- }
- return true;
+ if (!super::Attack(a_Dt))
+ {
+ return false;
+ }
+
+ if (GetTarget()->IsPawn())
+ {
+ // TODO: Easy = no poison, Medium = 7 seconds, Hard = 15 seconds
+ static_cast<cPawn *>(GetTarget())->AddEntityEffect(cEntityEffect::effPoison, 7 * 20, 0);
+ }
+ return true;
}*/
@@ -53,16 +54,16 @@ bool cCaveSpider::Attack(std::chrono::milliseconds a_Dt)
void cCaveSpider::GetDrops(cItems & a_Drops, cEntity * a_Killer)
{
- unsigned int LootingLevel = 0;
- if (a_Killer != nullptr)
- {
- LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
- }
- AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_STRING);
- if ((a_Killer != nullptr) && (a_Killer->IsPlayer() || a_Killer->IsA("cWolf")))
- {
- AddRandomUncommonDropItem(a_Drops, 33.0f, E_ITEM_SPIDER_EYE);
- }
+ unsigned int LootingLevel = 0;
+ if (a_Killer != nullptr)
+ {
+ LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
+ }
+ AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_STRING);
+ if ((a_Killer != nullptr) && (a_Killer->IsPlayer() || a_Killer->IsA("cWolf")))
+ {
+ AddRandomUncommonDropItem(a_Drops, 33.0f, E_ITEM_SPIDER_EYE);
+ }
}
diff --git a/src/Mobs/CaveSpider.h b/src/Mobs/CaveSpider.h
index 71ee0b244..f59809d03 100644
--- a/src/Mobs/CaveSpider.h
+++ b/src/Mobs/CaveSpider.h
@@ -1,23 +1,23 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cCaveSpider :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- cCaveSpider(void);
+ cCaveSpider(void);
- CLASS_PROTODEF(cCaveSpider)
+ CLASS_PROTODEF(cCaveSpider)
- virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
} ;
diff --git a/src/Mobs/Chicken.cpp b/src/Mobs/Chicken.cpp
index cc691fa5b..a7b27fc11 100644
--- a/src/Mobs/Chicken.cpp
+++ b/src/Mobs/Chicken.cpp
@@ -10,6 +10,7 @@ cChicken::cChicken(void) :
{
SetGravity(-2.0f);
SetAirDrag(0.0f);
+ m_EMPersonality = PASSIVE;
m_BehaviorBreeder.AttachToMonster(*this);
m_BehaviorCoward.AttachToMonster(*this);
m_BehaviorItemFollower.AttachToMonster(*this);
diff --git a/src/Mobs/Cow.cpp b/src/Mobs/Cow.cpp
index b5703fc1f..3d94986bb 100644
--- a/src/Mobs/Cow.cpp
+++ b/src/Mobs/Cow.cpp
@@ -32,21 +32,3 @@ void cCow::GetDrops(cItems & a_Drops, cEntity * a_Killer)
AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_LEATHER);
AddRandomDropItem(a_Drops, 1, 3 + LootingLevel, IsOnFire() ? E_ITEM_STEAK : E_ITEM_RAW_BEEF);
}
-
-
-
-
-
-cBehaviorBreeder * cCow::GetBehaviorBreeder()
-{
- return &m_BehaviorBreeder;
-}
-
-
-
-
-
-const cBehaviorBreeder * cCow::GetBehaviorBreeder() const
-{
- return static_cast<const cBehaviorBreeder *>(&m_BehaviorBreeder);
-}
diff --git a/src/Mobs/Cow.h b/src/Mobs/Cow.h
index 78b584bdc..58380065a 100644
--- a/src/Mobs/Cow.h
+++ b/src/Mobs/Cow.h
@@ -22,9 +22,6 @@ public:
{
a_Items.Add(E_ITEM_WHEAT);
}
-
- virtual cBehaviorBreeder * GetBehaviorBreeder() override;
- virtual const cBehaviorBreeder * GetBehaviorBreeder() const override;
private:
// Tick controlling behaviors
cBehaviorBreeder m_BehaviorBreeder;
diff --git a/src/Mobs/Creeper.cpp b/src/Mobs/Creeper.cpp
index 65576ff25..8de236863 100644
--- a/src/Mobs/Creeper.cpp
+++ b/src/Mobs/Creeper.cpp
@@ -17,6 +17,7 @@ cCreeper::cCreeper(void) :
m_BurnedWithFlintAndSteel(false),
m_ExplodingTimer(0)
{
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/Creeper.h b/src/Mobs/Creeper.h
index 2ef72650b..28a0dd512 100644
--- a/src/Mobs/Creeper.h
+++ b/src/Mobs/Creeper.h
@@ -1,35 +1,35 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cCreeper :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- cCreeper(void);
+ cCreeper(void);
- CLASS_PROTODEF(cCreeper)
+ CLASS_PROTODEF(cCreeper)
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
- virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
- virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
- virtual void OnRightClicked(cPlayer & a_Player) override;
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
+ virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
+ virtual void OnRightClicked(cPlayer & a_Player) override;
- bool IsBlowing(void) const {return m_bIsBlowing; }
- bool IsCharged(void) const {return m_bIsCharged; }
- bool IsBurnedWithFlintAndSteel(void) const {return m_BurnedWithFlintAndSteel; }
+ bool IsBlowing(void) const {return m_bIsBlowing; }
+ bool IsCharged(void) const {return m_bIsCharged; }
+ bool IsBurnedWithFlintAndSteel(void) const {return m_BurnedWithFlintAndSteel; }
private:
- bool m_bIsBlowing, m_bIsCharged, m_BurnedWithFlintAndSteel;
- int m_ExplodingTimer;
+ bool m_bIsBlowing, m_bIsCharged, m_BurnedWithFlintAndSteel;
+ int m_ExplodingTimer;
} ;
diff --git a/src/Mobs/EnderDragon.cpp b/src/Mobs/EnderDragon.cpp
index 360fe581b..4db5baf87 100644
--- a/src/Mobs/EnderDragon.cpp
+++ b/src/Mobs/EnderDragon.cpp
@@ -11,6 +11,7 @@ cEnderDragon::cEnderDragon(void) :
// TODO: Vanilla source says this, but is it right? Dragons fly, they don't stand
super("EnderDragon", mtEnderDragon, "entity.enderdragon.hurt", "entity.enderdragon.death", 16.0, 8.0)
{
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/EnderDragon.h b/src/Mobs/EnderDragon.h
index 43acdcd54..0528af77c 100644
--- a/src/Mobs/EnderDragon.h
+++ b/src/Mobs/EnderDragon.h
@@ -1,16 +1,12 @@
#pragma once
-#include "AggressiveMonster.h"
-
-
-
-
+#include "Monster.h"
class cEnderDragon :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
cEnderDragon(void);
diff --git a/src/Mobs/Enderman.cpp b/src/Mobs/Enderman.cpp
index 6aa72369f..72301b21a 100644
--- a/src/Mobs/Enderman.cpp
+++ b/src/Mobs/Enderman.cpp
@@ -79,6 +79,7 @@ cEnderman::cEnderman(void) :
CarriedBlock(E_BLOCK_AIR),
CarriedMeta(0)
{
+ m_EMPersonality = PASSIVE;
}
diff --git a/src/Mobs/Enderman.h b/src/Mobs/Enderman.h
index 0dc648468..c3568e1db 100644
--- a/src/Mobs/Enderman.h
+++ b/src/Mobs/Enderman.h
@@ -1,39 +1,37 @@
-
#pragma once
-
-#include "PassiveAggressiveMonster.h"
+#include "Monster.h"
class cEnderman :
- public cPassiveAggressiveMonster
+ public cMonster
{
- typedef cPassiveAggressiveMonster super;
+ typedef cMonster super;
public:
- cEnderman(void);
+ cEnderman(void);
- CLASS_PROTODEF(cEnderman)
+ CLASS_PROTODEF(cEnderman)
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
- virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ virtual void Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk) override;
- bool IsScreaming(void) const {return m_bIsScreaming; }
- BLOCKTYPE GetCarriedBlock(void) const {return CarriedBlock; }
- NIBBLETYPE GetCarriedMeta(void) const {return CarriedMeta; }
+ bool IsScreaming(void) const {return m_bIsScreaming; }
+ BLOCKTYPE GetCarriedBlock(void) const {return CarriedBlock; }
+ NIBBLETYPE GetCarriedMeta(void) const {return CarriedMeta; }
- /** Returns if the current sky light level is sufficient for the enderman to become aggravated */
- bool CheckLight(void);
- /** Returns if the enderman gets hit by the rain */
- bool CheckRain(void);
+ /** Returns if the current sky light level is sufficient for the enderman to become aggravated */
+ bool CheckLight(void);
+ /** Returns if the enderman gets hit by the rain */
+ bool CheckRain(void);
private:
- bool m_bIsScreaming;
- BLOCKTYPE CarriedBlock;
- NIBBLETYPE CarriedMeta;
+ bool m_bIsScreaming;
+ BLOCKTYPE CarriedBlock;
+ NIBBLETYPE CarriedMeta;
} ;
diff --git a/src/Mobs/Ghast.cpp b/src/Mobs/Ghast.cpp
index 97a27be5a..d9cd31f45 100644
--- a/src/Mobs/Ghast.cpp
+++ b/src/Mobs/Ghast.cpp
@@ -9,8 +9,9 @@
cGhast::cGhast(void) :
- super("Ghast", mtGhast, "entity.ghast.hurt", "entity.ghast.death", 4, 4)
+ super("Ghast", mtGhast, "entity.ghast.hurt", "entity.ghast.death", 4, 4)
{
+ m_EMPersonality = AGGRESSIVE;
}
@@ -19,13 +20,13 @@ cGhast::cGhast(void) :
void cGhast::GetDrops(cItems & a_Drops, cEntity * a_Killer)
{
- unsigned int LootingLevel = 0;
- if (a_Killer != nullptr)
- {
- LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
- }
- AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER);
- AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_GHAST_TEAR);
+ unsigned int LootingLevel = 0;
+ if (a_Killer != nullptr)
+ {
+ LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
+ }
+ AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_GUNPOWDER);
+ AddRandomDropItem(a_Drops, 0, 1 + LootingLevel, E_ITEM_GHAST_TEAR);
}
@@ -34,23 +35,23 @@ void cGhast::GetDrops(cItems & a_Drops, cEntity * a_Killer)
// mobTODO
/*bool cGhast::Attack(std::chrono::milliseconds a_Dt)
{
- if ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))
- {
- // Setting this higher gives us more wiggle room for attackrate
- Vector3d Speed = GetLookVector() * 20;
- Speed.y = Speed.y + 1;
-
- auto GhastBall = cpp14::make_unique<cGhastFireballEntity>(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
- auto GhastBallPtr = GhastBall.get();
- if (!GhastBallPtr->Initialize(std::move(GhastBall), *m_World))
- {
- return false;
- }
-
- ResetAttackCooldown();
- return true;
- }
- return false;
+ if ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))
+ {
+ // Setting this higher gives us more wiggle room for attackrate
+ Vector3d Speed = GetLookVector() * 20;
+ Speed.y = Speed.y + 1;
+
+ auto GhastBall = cpp14::make_unique<cGhastFireballEntity>(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
+ auto GhastBallPtr = GhastBall.get();
+ if (!GhastBallPtr->Initialize(std::move(GhastBall), *m_World))
+ {
+ return false;
+ }
+
+ ResetAttackCooldown();
+ return true;
+ }
+ return false;
}*/
diff --git a/src/Mobs/Ghast.h b/src/Mobs/Ghast.h
index c3423590a..7fea31ae8 100644
--- a/src/Mobs/Ghast.h
+++ b/src/Mobs/Ghast.h
@@ -1,25 +1,23 @@
-
#pragma once
-
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cGhast :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- cGhast(void);
+ cGhast(void);
- CLASS_PROTODEF(cGhast)
+ CLASS_PROTODEF(cGhast)
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
- bool IsCharging(void) const {return false; }
+ bool IsCharging(void) const {return false; }
} ;
diff --git a/src/Mobs/Giant.cpp b/src/Mobs/Giant.cpp
index 0f235e10f..c25b4e6a0 100644
--- a/src/Mobs/Giant.cpp
+++ b/src/Mobs/Giant.cpp
@@ -10,7 +10,7 @@
cGiant::cGiant(void) :
super("Giant", mtGiant, "entity.zombie.hurt", "entity.zombie.death", 3.6, 10.8)
{
-
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/Giant.h b/src/Mobs/Giant.h
index 70e93894c..f1734437b 100644
--- a/src/Mobs/Giant.h
+++ b/src/Mobs/Giant.h
@@ -1,16 +1,16 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cGiant :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
cGiant(void);
diff --git a/src/Mobs/Guardian.cpp b/src/Mobs/Guardian.cpp
index f36f98ea8..ca6b04d55 100644
--- a/src/Mobs/Guardian.cpp
+++ b/src/Mobs/Guardian.cpp
@@ -11,6 +11,7 @@
cGuardian::cGuardian(void) :
super("Guardian", mtGuardian, "entity.guardian.hurt", "entity.guardian.death", 0.875, 0.8)
{
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/Guardian.h b/src/Mobs/Guardian.h
index 289654f57..988f36832 100644
--- a/src/Mobs/Guardian.h
+++ b/src/Mobs/Guardian.h
@@ -1,16 +1,16 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cGuardian :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
cGuardian();
diff --git a/src/Mobs/Horse.cpp b/src/Mobs/Horse.cpp
index 247de9699..6ff53df69 100644
--- a/src/Mobs/Horse.cpp
+++ b/src/Mobs/Horse.cpp
@@ -197,21 +197,3 @@ void cHorse::HandleSpeedFromAttachee(float a_Forward, float a_Sideways)
super::HandleSpeedFromAttachee(a_Forward * m_MaxSpeed, a_Sideways * m_MaxSpeed);
}
}
-
-
-
-
-
-cBehaviorBreeder * cHorse::GetBehaviorBreeder()
-{
- return &m_BehaviorBreeder;
-}
-
-
-
-
-
-const cBehaviorBreeder * cHorse::GetBehaviorBreeder() const
-{
- return static_cast<const cBehaviorBreeder *>(&m_BehaviorBreeder);
-}
diff --git a/src/Mobs/Horse.h b/src/Mobs/Horse.h
index 3c5a50671..e96a1f8a9 100644
--- a/src/Mobs/Horse.h
+++ b/src/Mobs/Horse.h
@@ -42,9 +42,6 @@ public:
a_Items.Add(E_ITEM_GOLDEN_CARROT);
a_Items.Add(E_ITEM_GOLDEN_APPLE);
}
-
- virtual cBehaviorBreeder * GetBehaviorBreeder() override;
- virtual const cBehaviorBreeder * GetBehaviorBreeder() const override;
private:
// Tick controlling behaviors
cBehaviorBreeder m_BehaviorBreeder;
diff --git a/src/Mobs/IronGolem.cpp b/src/Mobs/IronGolem.cpp
index 448ed8dc0..223161c68 100644
--- a/src/Mobs/IronGolem.cpp
+++ b/src/Mobs/IronGolem.cpp
@@ -10,6 +10,7 @@
cIronGolem::cIronGolem(void) :
super("IronGolem", mtIronGolem, "entity.irongolem.hurt", "entity.irongolem.death", 1.4, 2.9)
{
+ m_EMPersonality = PASSIVE;
}
diff --git a/src/Mobs/IronGolem.h b/src/Mobs/IronGolem.h
index 7d35686e7..c35452e3b 100644
--- a/src/Mobs/IronGolem.h
+++ b/src/Mobs/IronGolem.h
@@ -1,16 +1,16 @@
#pragma once
-#include "PassiveAggressiveMonster.h"
+#include "Monster.h"
class cIronGolem :
- public cPassiveAggressiveMonster
+ public cMonster
{
- typedef cPassiveAggressiveMonster super;
+ typedef cMonster super;
public:
cIronGolem(void);
diff --git a/src/Mobs/MagmaCube.cpp b/src/Mobs/MagmaCube.cpp
index 4d70a0291..dd4e6916e 100644
--- a/src/Mobs/MagmaCube.cpp
+++ b/src/Mobs/MagmaCube.cpp
@@ -10,6 +10,7 @@ cMagmaCube::cMagmaCube(int a_Size) :
super("MagmaCube", mtMagmaCube, Printf("entity.%smagmacube.hurt", GetSizeName(a_Size).c_str()), Printf("entity.%smagmacube.death", GetSizeName(a_Size).c_str()), 0.6 * a_Size, 0.6 * a_Size),
m_Size(a_Size)
{
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/MagmaCube.h b/src/Mobs/MagmaCube.h
index 5fc8105ba..960ff0c90 100644
--- a/src/Mobs/MagmaCube.h
+++ b/src/Mobs/MagmaCube.h
@@ -1,15 +1,15 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cMagmaCube :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
/** Creates a MagmaCube of the specified size; with 1 being the smallest */
diff --git a/src/Mobs/MobPointer.cpp b/src/Mobs/MobPointer.cpp
index 6e3bccee1..8fb64867d 100644
--- a/src/Mobs/MobPointer.cpp
+++ b/src/Mobs/MobPointer.cpp
@@ -56,7 +56,7 @@ cMobPointer& cMobPointer::operator=(cMobPointer&& a_MobPointer)
-void cMobPointer::operator=(cPawn * a_Pointer)
+void cMobPointer::SetPointer(cPawn * a_Pointer)
{
m_Pointer = a_Pointer;
}
diff --git a/src/Mobs/MobPointer.h b/src/Mobs/MobPointer.h
index 77f4cd6cd..3534d760d 100644
--- a/src/Mobs/MobPointer.h
+++ b/src/Mobs/MobPointer.h
@@ -17,7 +17,7 @@ public:
cMobPointer& operator=(const cMobPointer& a_MobPointer); // Copy assignment operator
cMobPointer& operator=(cMobPointer&& a_MobPointer); // Move assignment operator
- void operator=(cPawn * a_Pointer); // set Pointer
+ void SetPointer(cPawn * a_Pointer); // set Pointer
/** Returns the raw pointer. The returned raw pointer must
be used locally and then discarded. it MUST NOT be preserved across ticks.
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp
index 7472e3391..fc1c1678d 100644
--- a/src/Mobs/Monster.cpp
+++ b/src/Mobs/Monster.cpp
@@ -85,6 +85,8 @@ static const struct
cMonster::cMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height)
: super(etMonster, a_Width, a_Height)
+ , m_BehaviorBreederPointer(nullptr)
+ , m_BehaviorAttackerPointer(nullptr)
, m_EMPersonality(AGGRESSIVE)
, m_NearestPlayerIsStale(true)
, m_PathFinder(a_Width, a_Height)
@@ -115,6 +117,7 @@ cMonster::cMonster(const AString & a_ConfigName, eMonsterType a_MobType, const A
, m_LookingAt(nullptr)
, m_CurrentTickControllingBehavior(nullptr)
, m_NewTickControllingBehavior(nullptr)
+ , m_PinnedBehavior(nullptr)
, m_TickControllingBehaviorState(Normal)
{
if (!a_ConfigName.empty())
@@ -328,8 +331,12 @@ void cMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
// If we're in a regular tick cycle
if (m_TickControllingBehaviorState == Normal)
{
-
- if (m_PinnedBehavior != nullptr)
+ if (IsLeashed())
+ {
+ // do not tick behaviors
+ // mobTodo temporary leash special case. Needs a behavior eventually.
+ }
+ else if (m_PinnedBehavior != nullptr)
{
// A behavior is pinned. We give it control automatically.
ASSERT(m_CurrentTickControllingBehavior == m_PinnedBehavior);
@@ -470,7 +477,9 @@ void cMonster::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
SetPitchAndYawFromDestination(a_IsFollowingPath);
// Leash calculations
- if ((m_TicksAlive % LEASH_ACTIONS_TICK_STEP) == 0)
+ if ((m_TickControllingBehaviorState == Normal) &&
+ ((m_TicksAlive % LEASH_ACTIONS_TICK_STEP) == 0)
+ )
{
CalcLeashActions();
}
@@ -988,7 +997,7 @@ int cMonster::GetSpawnDelay(cMonster::eFamily a_MobFamily)
void cMonster::SetLookingAt(cPawn * a_NewTarget)
{
- m_LookingAt = a_NewTarget;
+ m_LookingAt.SetPointer(a_NewTarget);
/*
ASSERT((a_NewTarget == nullptr) || (IsTicking()));
@@ -1029,7 +1038,7 @@ bool cMonster::IsPathFinderActivated() const
cBehaviorBreeder * cMonster::GetBehaviorBreeder()
{
- return nullptr;
+ return m_BehaviorBreederPointer;
}
@@ -1038,7 +1047,7 @@ cBehaviorBreeder * cMonster::GetBehaviorBreeder()
const cBehaviorBreeder * cMonster::GetBehaviorBreeder() const
{
- return nullptr;
+ return static_cast<const cBehaviorBreeder *>(m_BehaviorBreederPointer);
}
@@ -1047,16 +1056,7 @@ const cBehaviorBreeder * cMonster::GetBehaviorBreeder() const
cBehaviorAttacker * cMonster::GetBehaviorAttacker()
{
- return nullptr;
-}
-
-
-
-
-
-cBehaviorDayLightBurner * cMonster::GetBehaviorDayLightBurner()
-{
- return nullptr;
+ return m_BehaviorAttackerPointer;
}
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h
index f97cd3e3f..1ed443aad 100644
--- a/src/Mobs/Monster.h
+++ b/src/Mobs/Monster.h
@@ -200,10 +200,11 @@ public:
bool IsPathFinderActivated() const;
// Behavior getters (most are probably not used. mobTodo - cleanup most of them)
- virtual cBehaviorBreeder * GetBehaviorBreeder();
- virtual const cBehaviorBreeder * GetBehaviorBreeder() const;
- virtual cBehaviorAttacker * GetBehaviorAttacker();
- virtual cBehaviorDayLightBurner * GetBehaviorDayLightBurner(); // mobTodo this is probably temporary
+ cBehaviorBreeder * GetBehaviorBreeder();
+ const cBehaviorBreeder * GetBehaviorBreeder() const;
+ cBehaviorAttacker * GetBehaviorAttacker();\
+ cBehaviorBreeder * m_BehaviorBreederPointer;
+ cBehaviorAttacker * m_BehaviorAttackerPointer;
// Polymorphic behavior functions
virtual void InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2);
diff --git a/src/Mobs/Mooshroom.cpp b/src/Mobs/Mooshroom.cpp
index 7a1feefcb..91baaee66 100644
--- a/src/Mobs/Mooshroom.cpp
+++ b/src/Mobs/Mooshroom.cpp
@@ -78,21 +78,3 @@ void cMooshroom::OnRightClicked(cPlayer & a_Player)
} break;
}
}
-
-
-
-
-
-cBehaviorBreeder * cMooshroom::GetBehaviorBreeder()
-{
- return &m_BehaviorBreeder;
-}
-
-
-
-
-
-const cBehaviorBreeder * cMooshroom::GetBehaviorBreeder() const
-{
- return static_cast<const cBehaviorBreeder *>(&m_BehaviorBreeder);
-}
diff --git a/src/Mobs/Mooshroom.h b/src/Mobs/Mooshroom.h
index fa92c770f..06e5cf8ce 100644
--- a/src/Mobs/Mooshroom.h
+++ b/src/Mobs/Mooshroom.h
@@ -28,9 +28,6 @@ public:
{
a_Items.Add(E_ITEM_WHEAT);
}
-
- virtual cBehaviorBreeder * GetBehaviorBreeder() override;
- virtual const cBehaviorBreeder * GetBehaviorBreeder() const override;
private:
// Tick controlling behaviors
cBehaviorBreeder m_BehaviorBreeder;
diff --git a/src/Mobs/PassiveAggressiveMonster.cpp b/src/Mobs/PassiveAggressiveMonster.cpp
deleted file mode 100644
index 28f45994c..000000000
--- a/src/Mobs/PassiveAggressiveMonster.cpp
+++ /dev/null
@@ -1,16 +0,0 @@
-
-#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules
-
-#include "PassiveAggressiveMonster.h"
-
-#include "../Entities/Player.h"
-
-
-
-
-
-cPassiveAggressiveMonster::cPassiveAggressiveMonster(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 = PASSIVE;
-}
diff --git a/src/Mobs/PassiveAggressiveMonster.h b/src/Mobs/PassiveAggressiveMonster.h
deleted file mode 100644
index 8a45bcfb1..000000000
--- a/src/Mobs/PassiveAggressiveMonster.h
+++ /dev/null
@@ -1,21 +0,0 @@
-
-#pragma once
-
-#include "AggressiveMonster.h"
-
-
-
-
-
-class cPassiveAggressiveMonster :
- public cAggressiveMonster
-{
- typedef cAggressiveMonster super;
-
-public:
- cPassiveAggressiveMonster(const AString & a_ConfigName, eMonsterType a_MobType, const AString & a_SoundHurt, const AString & a_SoundDeath, double a_Width, double a_Height);
-} ;
-
-
-
-
diff --git a/src/Mobs/Pig.cpp b/src/Mobs/Pig.cpp
index 6c3de4427..ce5e9dca0 100644
--- a/src/Mobs/Pig.cpp
+++ b/src/Mobs/Pig.cpp
@@ -131,24 +131,3 @@ bool cPig::DoTakeDamage(TakeDamageInfo & a_TDI)
}
return true;
}
-
-
-
-
-
-cBehaviorBreeder * cPig::GetBehaviorBreeder()
-{
- return &m_BehaviorBreeder;
-}
-
-
-
-
-
-const cBehaviorBreeder * cPig::GetBehaviorBreeder() const
-{
- return static_cast<const cBehaviorBreeder *>(&m_BehaviorBreeder);
-}
-
-
-
diff --git a/src/Mobs/Pig.h b/src/Mobs/Pig.h
index 276ac1df8..9a138f83e 100644
--- a/src/Mobs/Pig.h
+++ b/src/Mobs/Pig.h
@@ -30,8 +30,6 @@ public:
}
bool IsSaddled(void) const { return m_bIsSaddled; }
- virtual cBehaviorBreeder * GetBehaviorBreeder() override;
- virtual const cBehaviorBreeder * GetBehaviorBreeder() const override;
private:
// Tick controlling behaviors
cBehaviorBreeder m_BehaviorBreeder;
diff --git a/src/Mobs/Rabbit.cpp b/src/Mobs/Rabbit.cpp
index 070396ded..0be458e3b 100644
--- a/src/Mobs/Rabbit.cpp
+++ b/src/Mobs/Rabbit.cpp
@@ -49,21 +49,3 @@ void cRabbit::GetDrops(cItems & a_Drops, cEntity * a_Killer)
RareDrops.Add(cItem(E_ITEM_RABBITS_FOOT));
AddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);
}
-
-
-
-
-
-cBehaviorBreeder * cRabbit::GetBehaviorBreeder()
-{
- return &m_BehaviorBreeder;
-}
-
-
-
-
-
-const cBehaviorBreeder * cRabbit::GetBehaviorBreeder() const
-{
- return static_cast<const cBehaviorBreeder *>(&m_BehaviorBreeder);
-}
diff --git a/src/Mobs/Rabbit.h b/src/Mobs/Rabbit.h
index 89760cd7c..119ba280b 100644
--- a/src/Mobs/Rabbit.h
+++ b/src/Mobs/Rabbit.h
@@ -46,9 +46,6 @@ public:
eRabbitType GetRabbitType() const { return m_Type; }
int GetMoreCarrotTicks() const { return m_MoreCarrotTicks; }
-
- virtual cBehaviorBreeder * GetBehaviorBreeder() override;
- virtual const cBehaviorBreeder * GetBehaviorBreeder() const override;
private:
// Tick controlling behaviors
cBehaviorBreeder m_BehaviorBreeder;
diff --git a/src/Mobs/Sheep.cpp b/src/Mobs/Sheep.cpp
index cca3b944f..bd69db6c2 100644
--- a/src/Mobs/Sheep.cpp
+++ b/src/Mobs/Sheep.cpp
@@ -209,21 +209,3 @@ NIBBLETYPE cSheep::GenerateNaturalRandomColor(void)
return E_META_WOOL_PINK;
}
}
-
-
-
-
-
-cBehaviorBreeder * cSheep::GetBehaviorBreeder()
-{
- return &m_BehaviorBreeder;
-}
-
-
-
-
-
-const cBehaviorBreeder * cSheep::GetBehaviorBreeder() const
-{
- return static_cast<const cBehaviorBreeder *>(&m_BehaviorBreeder);
-}
diff --git a/src/Mobs/Sheep.h b/src/Mobs/Sheep.h
index 8ed91915e..89fa41edf 100644
--- a/src/Mobs/Sheep.h
+++ b/src/Mobs/Sheep.h
@@ -43,8 +43,6 @@ public:
int GetFurColor(void) const { return m_WoolColor; }
void SetFurColor(int a_WoolColor) { m_WoolColor = a_WoolColor; }
- virtual cBehaviorBreeder * GetBehaviorBreeder() override;
- virtual const cBehaviorBreeder * GetBehaviorBreeder() const override;
private:
// Tick controlling behaviors
diff --git a/src/Mobs/Silverfish.h b/src/Mobs/Silverfish.h
index 9988ca015..20b75474d 100644
--- a/src/Mobs/Silverfish.h
+++ b/src/Mobs/Silverfish.h
@@ -1,24 +1,24 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cSilverfish :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- cSilverfish(void) :
- super("Silverfish", mtSilverfish, "entity.silverfish.hurt", "entity.silverfish.death", 0.3, 0.7)
- {
- }
+ cSilverfish(void) :
+ super("Silverfish", mtSilverfish, "entity.silverfish.hurt", "entity.silverfish.death", 0.3, 0.7)
+ {
+ }
- CLASS_PROTODEF(cSilverfish)
+ CLASS_PROTODEF(cSilverfish)
} ;
diff --git a/src/Mobs/Skeleton.cpp b/src/Mobs/Skeleton.cpp
index 55616cc28..15be6c790 100644
--- a/src/Mobs/Skeleton.cpp
+++ b/src/Mobs/Skeleton.cpp
@@ -10,10 +10,10 @@
cSkeleton::cSkeleton(bool IsWither) :
- super("Skeleton", mtSkeleton, "entity.skeleton.hurt", "entity.skeleton.death", 0.6, 1.8),
- m_bIsWither(IsWither)
+ super("Skeleton", mtSkeleton, "entity.skeleton.hurt", "entity.skeleton.death", 0.6, 1.8),
+ m_bIsWither(IsWither)
{
-
+ m_EMPersonality = AGGRESSIVE;
}
@@ -22,26 +22,26 @@ cSkeleton::cSkeleton(bool IsWither) :
void cSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)
{
- unsigned int LootingLevel = 0;
- if (a_Killer != nullptr)
- {
- LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
- }
- if (IsWither())
- {
- AddRandomUncommonDropItem(a_Drops, 33.0f, E_ITEM_COAL);
- cItems RareDrops;
- RareDrops.Add(cItem(E_ITEM_HEAD, 1, 1));
- AddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);
- }
- else
- {
- AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_ARROW);
-
- }
- AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_BONE);
- AddRandomArmorDropItem(a_Drops, LootingLevel);
- AddRandomWeaponDropItem(a_Drops, LootingLevel);
+ unsigned int LootingLevel = 0;
+ if (a_Killer != nullptr)
+ {
+ LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
+ }
+ if (IsWither())
+ {
+ AddRandomUncommonDropItem(a_Drops, 33.0f, E_ITEM_COAL);
+ cItems RareDrops;
+ RareDrops.Add(cItem(E_ITEM_HEAD, 1, 1));
+ AddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);
+ }
+ else
+ {
+ AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_ARROW);
+
+ }
+ AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_BONE);
+ AddRandomArmorDropItem(a_Drops, LootingLevel);
+ AddRandomWeaponDropItem(a_Drops, LootingLevel);
}
@@ -50,25 +50,25 @@ void cSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)
//mobTodo
/*bool cSkeleton::Attack(std::chrono::milliseconds a_Dt)
{
- StopMovingToPosition(); // Todo handle this in a better way, the skeleton does some uneeded recalcs due to inStateChasing
- auto & Random = GetRandomProvider();
- if ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))
- {
- Vector3d Inaccuracy = Vector3d(Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25));
- Vector3d Speed = (GetTarget()->GetPosition() + Inaccuracy - GetPosition()) * 5;
- Speed.y += Random.RandInt(-1, 1);
-
- auto Arrow = cpp14::make_unique<cArrowEntity>(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
- auto ArrowPtr = Arrow.get();
- if (!ArrowPtr->Initialize(std::move(Arrow), *m_World))
- {
- return false;
- }
-
- ResetAttackCooldown();
- return true;
- }
- return false;
+ StopMovingToPosition(); // Todo handle this in a better way, the skeleton does some uneeded recalcs due to inStateChasing
+ auto & Random = GetRandomProvider();
+ if ((GetTarget() != nullptr) && (m_AttackCoolDownTicksLeft == 0))
+ {
+ Vector3d Inaccuracy = Vector3d(Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25), Random.RandReal<double>(-0.25, 0.25));
+ Vector3d Speed = (GetTarget()->GetPosition() + Inaccuracy - GetPosition()) * 5;
+ Speed.y += Random.RandInt(-1, 1);
+
+ auto Arrow = cpp14::make_unique<cArrowEntity>(this, GetPosX(), GetPosY() + 1, GetPosZ(), Speed);
+ auto ArrowPtr = Arrow.get();
+ if (!ArrowPtr->Initialize(std::move(Arrow), *m_World))
+ {
+ return false;
+ }
+
+ ResetAttackCooldown();
+ return true;
+ }
+ return false;
}*/
@@ -77,8 +77,8 @@ void cSkeleton::GetDrops(cItems & a_Drops, cEntity * a_Killer)
void cSkeleton::SpawnOn(cClientHandle & a_ClientHandle)
{
- super::SpawnOn(a_ClientHandle);
- a_ClientHandle.SendEntityEquipment(*this, 0, cItem(E_ITEM_BOW));
+ super::SpawnOn(a_ClientHandle);
+ a_ClientHandle.SendEntityEquipment(*this, 0, cItem(E_ITEM_BOW));
}
diff --git a/src/Mobs/Skeleton.h b/src/Mobs/Skeleton.h
index 91e094c4c..56e7339e0 100644
--- a/src/Mobs/Skeleton.h
+++ b/src/Mobs/Skeleton.h
@@ -1,33 +1,33 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cSkeleton :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- cSkeleton(bool IsWither);
+ cSkeleton(bool IsWither);
- CLASS_PROTODEF(cSkeleton)
+ CLASS_PROTODEF(cSkeleton)
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
- /*virtual bool Attack(std::chrono::milliseconds a_Dt) override;*/
- virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ /*virtual bool Attack(std::chrono::milliseconds a_Dt) override;*/
+ virtual void SpawnOn(cClientHandle & a_ClientHandle) override;
- virtual bool IsUndead(void) override { return true; }
+ virtual bool IsUndead(void) override { return true; }
- bool IsWither(void) const { return m_bIsWither; }
+ bool IsWither(void) const { return m_bIsWither; }
private:
- bool m_bIsWither;
+ bool m_bIsWither;
} ;
diff --git a/src/Mobs/Slime.cpp b/src/Mobs/Slime.cpp
index 92c181798..d5409ec11 100644
--- a/src/Mobs/Slime.cpp
+++ b/src/Mobs/Slime.cpp
@@ -19,6 +19,7 @@ cSlime::cSlime(int a_Size) :
),
m_Size(a_Size)
{
+ m_EMPersonality = AGGRESSIVE;
SetMaxHealth(a_Size * a_Size);
// SetAttackDamage(a_Size); //mobTodo myBehavior.setaTTACKDamage
}
diff --git a/src/Mobs/Slime.h b/src/Mobs/Slime.h
index 26bc6716d..f4f1aabd4 100644
--- a/src/Mobs/Slime.h
+++ b/src/Mobs/Slime.h
@@ -1,39 +1,38 @@
-
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cSlime :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- /** Creates a slime of the specified size; size can be 1, 2 or 4, with 1 is the smallest and 4 is the tallest. */
- cSlime(int a_Size);
+ /** Creates a slime of the specified size; size can be 1, 2 or 4, with 1 is the smallest and 4 is the tallest. */
+ cSlime(int a_Size);
- CLASS_PROTODEF(cSlime)
+ CLASS_PROTODEF(cSlime)
- // cAggressiveMonster overrides:
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
- // virtual bool Attack(std::chrono::milliseconds a_Dt) override;
- virtual void KilledBy(TakeDamageInfo & a_TDI) override;
+ // cAggressiveMonster overrides:
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ // virtual bool Attack(std::chrono::milliseconds a_Dt) override;
+ virtual void KilledBy(TakeDamageInfo & a_TDI) override;
- int GetSize(void) const { return m_Size; }
+ int GetSize(void) const { return m_Size; }
- /** Returns the text describing the slime's size, as used by the client's resource subsystem for sounds.
- Returns either "big" or "small". */
- static AString GetSizeName(int a_Size);
+ /** Returns the text describing the slime's size, as used by the client's resource subsystem for sounds.
+ Returns either "big" or "small". */
+ static AString GetSizeName(int a_Size);
protected:
- /** Size of the slime, with 1 being the smallest.
- Vanilla uses sizes 1, 2 and 4 only. */
- int m_Size;
+ /** Size of the slime, with 1 being the smallest.
+ Vanilla uses sizes 1, 2 and 4 only. */
+ int m_Size;
} ;
diff --git a/src/Mobs/SnowGolem.cpp b/src/Mobs/SnowGolem.cpp
index c86577a1e..fd8ce1112 100644
--- a/src/Mobs/SnowGolem.cpp
+++ b/src/Mobs/SnowGolem.cpp
@@ -11,6 +11,7 @@
cSnowGolem::cSnowGolem(void) :
super("SnowGolem", mtSnowGolem, "entity.snowman.hurt", "entity.snowman.death", 0.4, 1.8)
{
+ m_EMPersonality = PASSIVE;
}
diff --git a/src/Mobs/SnowGolem.h b/src/Mobs/SnowGolem.h
index 708ddbef9..59026b3ec 100644
--- a/src/Mobs/SnowGolem.h
+++ b/src/Mobs/SnowGolem.h
@@ -1,16 +1,16 @@
#pragma once
-#include "PassiveAggressiveMonster.h"
+#include "Monster.h"
class cSnowGolem :
- public cPassiveAggressiveMonster
+ public cMonster
{
- typedef cPassiveAggressiveMonster super;
+ typedef cMonster super;
public:
cSnowGolem(void);
diff --git a/src/Mobs/Spider.cpp b/src/Mobs/Spider.cpp
index 608bcd853..e8d65157c 100644
--- a/src/Mobs/Spider.cpp
+++ b/src/Mobs/Spider.cpp
@@ -11,6 +11,7 @@
cSpider::cSpider(void) :
super("Spider", mtSpider, "entity.spider.hurt", "entity.spider.death", 1.4, 0.9)
{
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/Spider.h b/src/Mobs/Spider.h
index 296c9f261..de2c8d533 100644
--- a/src/Mobs/Spider.h
+++ b/src/Mobs/Spider.h
@@ -1,24 +1,24 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cSpider :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
- cSpider(void);
+ cSpider(void);
- CLASS_PROTODEF(cSpider)
+ CLASS_PROTODEF(cSpider)
- virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
- virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
+ virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
} ;
diff --git a/src/Mobs/Witch.cpp b/src/Mobs/Witch.cpp
index 3f56108ae..e9baf5512 100644
--- a/src/Mobs/Witch.cpp
+++ b/src/Mobs/Witch.cpp
@@ -11,6 +11,7 @@
cWitch::cWitch(void) :
super("Witch", mtWitch, "entity.witch.hurt", "entity.witch.death", 0.6, 1.8)
{
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/Witch.h b/src/Mobs/Witch.h
index 79cc993bc..7013f998a 100644
--- a/src/Mobs/Witch.h
+++ b/src/Mobs/Witch.h
@@ -1,16 +1,16 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cWitch :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
cWitch();
diff --git a/src/Mobs/Wither.cpp b/src/Mobs/Wither.cpp
index dd85d7d2b..99b9a3ce8 100644
--- a/src/Mobs/Wither.cpp
+++ b/src/Mobs/Wither.cpp
@@ -16,6 +16,7 @@ cWither::cWither(void) :
{
SetMaxHealth(300);
SetHealth(GetMaxHealth() / 3);
+ m_EMPersonality = AGGRESSIVE;
}
diff --git a/src/Mobs/Wither.h b/src/Mobs/Wither.h
index 5f6ec607c..023fc773c 100644
--- a/src/Mobs/Wither.h
+++ b/src/Mobs/Wither.h
@@ -1,16 +1,16 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
class cWither :
- public cAggressiveMonster
+ public cMonster
{
- typedef cAggressiveMonster super;
+ typedef cMonster super;
public:
cWither(void);
diff --git a/src/Mobs/Wolf.cpp b/src/Mobs/Wolf.cpp
index f57832c92..c08e572fb 100644
--- a/src/Mobs/Wolf.cpp
+++ b/src/Mobs/Wolf.cpp
@@ -22,6 +22,7 @@ cWolf::cWolf(void) :
m_NotificationCooldown(0)
{
m_RelativeWalkSpeed = 2;
+ m_EMPersonality = PASSIVE;
}
diff --git a/src/Mobs/Wolf.h b/src/Mobs/Wolf.h
index 851cf888b..515cd33e8 100644
--- a/src/Mobs/Wolf.h
+++ b/src/Mobs/Wolf.h
@@ -1,7 +1,7 @@
#pragma once
-#include "PassiveAggressiveMonster.h"
+#include "Monster.h"
#include "../UUID.h"
diff --git a/src/Mobs/Zombie.cpp b/src/Mobs/Zombie.cpp
index 6f889e182..4f616c609 100644
--- a/src/Mobs/Zombie.cpp
+++ b/src/Mobs/Zombie.cpp
@@ -10,11 +10,18 @@
cZombie::cZombie(bool a_IsVillagerZombie) :
- super("Zombie", mtZombie, "entity.zombie.hurt", "entity.zombie.death", 0.6, 1.8),
- m_IsVillagerZombie(a_IsVillagerZombie),
- m_IsConverting(false)
+ super("Zombie", mtZombie, "entity.zombie.hurt", "entity.zombie.death", 0.6, 1.8),
+ m_IsVillagerZombie(a_IsVillagerZombie),
+ m_IsConverting(false)
{
-
+ m_EMPersonality = AGGRESSIVE;
+
+ m_BehaviorAttackerMelee.AttachToMonster(*this);
+ m_BehaviorWanderer.AttachToMonster(*this);
+ m_BehaviorAggressive.AttachToMonster(*this);
+ m_BehaviourDayLightBurner.AttachToMonster(*this);
+ GetMonsterConfig("Zombie");
+ // Todo I need the config to load after attaching attackerMelee but this is not clean.
}
@@ -23,17 +30,17 @@ cZombie::cZombie(bool a_IsVillagerZombie) :
void cZombie::GetDrops(cItems & a_Drops, cEntity * a_Killer)
{
- unsigned int LootingLevel = 0;
- if (a_Killer != nullptr)
- {
- LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
- }
- AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_ROTTEN_FLESH);
- cItems RareDrops;
- RareDrops.Add(cItem(E_ITEM_IRON));
- RareDrops.Add(cItem(E_ITEM_CARROT));
- RareDrops.Add(cItem(E_ITEM_POTATO));
- AddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);
- AddRandomArmorDropItem(a_Drops, LootingLevel);
- AddRandomWeaponDropItem(a_Drops, LootingLevel);
+ unsigned int LootingLevel = 0;
+ if (a_Killer != nullptr)
+ {
+ LootingLevel = a_Killer->GetEquippedWeapon().m_Enchantments.GetLevel(cEnchantments::enchLooting);
+ }
+ AddRandomDropItem(a_Drops, 0, 2 + LootingLevel, E_ITEM_ROTTEN_FLESH);
+ cItems RareDrops;
+ RareDrops.Add(cItem(E_ITEM_IRON));
+ RareDrops.Add(cItem(E_ITEM_CARROT));
+ RareDrops.Add(cItem(E_ITEM_POTATO));
+ AddRandomRareDropItem(a_Drops, RareDrops, LootingLevel);
+ AddRandomArmorDropItem(a_Drops, LootingLevel);
+ AddRandomWeaponDropItem(a_Drops, LootingLevel);
}
diff --git a/src/Mobs/Zombie.h b/src/Mobs/Zombie.h
index 66b6b6362..1bb2ebd45 100644
--- a/src/Mobs/Zombie.h
+++ b/src/Mobs/Zombie.h
@@ -1,7 +1,12 @@
#pragma once
-#include "AggressiveMonster.h"
+#include "Monster.h"
+#include "Behaviors/BehaviorAttackerMelee.h"
+#include "Behaviors/BehaviorWanderer.h"
+
+#include "Behaviors/BehaviorAggressive.h"
+#include "Behaviors/BehaviorDayLightBurner.h"
@@ -21,12 +26,18 @@ public:
bool IsVillagerZombie(void) const { return m_IsVillagerZombie; }
bool IsConverting (void) const { return m_IsConverting; }
-
private:
bool m_IsVillagerZombie;
bool m_IsConverting;
+ // tick behaviors
+ cBehaviorAttackerMelee m_BehaviorAttackerMelee;
+ cBehaviorWanderer m_BehaviorWanderer;
+
+ // other behaviors
+ cBehaviorAggressive m_BehaviorAggressive;
+ cBehaviorDayLightBurner m_BehaviourDayLightBurner;
} ;
diff --git a/src/Mobs/ZombiePigman.cpp b/src/Mobs/ZombiePigman.cpp
index 2581d3751..07dbf4aa0 100644
--- a/src/Mobs/ZombiePigman.cpp
+++ b/src/Mobs/ZombiePigman.cpp
@@ -11,6 +11,7 @@
cZombiePigman::cZombiePigman(void) :
super("ZombiePigman", mtZombiePigman, "entity.zombie_pig.hurt", "entity.zombie_pig.death", 0.6, 1.8)
{
+ m_EMPersonality = PASSIVE;
}
diff --git a/src/Mobs/ZombiePigman.h b/src/Mobs/ZombiePigman.h
index 23a7be8da..dad420da7 100644
--- a/src/Mobs/ZombiePigman.h
+++ b/src/Mobs/ZombiePigman.h
@@ -1,15 +1,15 @@
#pragma once
-#include "PassiveAggressiveMonster.h"
+#include "Monster.h"
class cZombiePigman :
- public cPassiveAggressiveMonster
+ public cMonster
{
- typedef cPassiveAggressiveMonster super;
+ typedef cMonster super;
public:
cZombiePigman(void);