summaryrefslogtreecommitdiffstats
path: root/src/Mobs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs')
-rw-r--r--src/Mobs/Monster.h2
-rw-r--r--src/Mobs/Mooshroom.cpp2
-rw-r--r--src/Mobs/Pig.cpp2
-rw-r--r--src/Mobs/Rabbit.cpp15
-rw-r--r--src/Mobs/Rabbit.h25
-rw-r--r--src/Mobs/Spider.cpp42
-rw-r--r--src/Mobs/Spider.h2
-rw-r--r--src/Mobs/Villager.cpp2
8 files changed, 86 insertions, 6 deletions
diff --git a/src/Mobs/Monster.h b/src/Mobs/Monster.h
index 2832a1570..d5de3b19e 100644
--- a/src/Mobs/Monster.h
+++ b/src/Mobs/Monster.h
@@ -115,9 +115,11 @@ public:
virtual bool IsTame (void) const { return false; }
virtual bool IsSitting (void) const { return false; }
+ // tolua_begin
bool IsBaby (void) const { return m_Age < 0; }
char GetAge (void) const { return m_Age; }
void SetAge(char a_Age) { m_Age = a_Age; }
+ // tolua_end
// tolua_begin
diff --git a/src/Mobs/Mooshroom.cpp b/src/Mobs/Mooshroom.cpp
index 3b2fbad57..08cabe143 100644
--- a/src/Mobs/Mooshroom.cpp
+++ b/src/Mobs/Mooshroom.cpp
@@ -67,7 +67,7 @@ void cMooshroom::OnRightClicked(cPlayer & a_Player)
cItems Drops;
Drops.push_back(cItem(E_BLOCK_RED_MUSHROOM, 5, 0));
m_World->SpawnItemPickups(Drops, GetPosX(), GetPosY(), GetPosZ(), 10);
- m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtCow);
+ m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtCow, false);
Destroy();
} break;
}
diff --git a/src/Mobs/Pig.cpp b/src/Mobs/Pig.cpp
index efa779ac2..21c8e923a 100644
--- a/src/Mobs/Pig.cpp
+++ b/src/Mobs/Pig.cpp
@@ -108,7 +108,7 @@ bool cPig::DoTakeDamage(TakeDamageInfo & a_TDI)
if (a_TDI.DamageType == dtLightning)
{
Destroy();
- m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtZombiePigman);
+ m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtZombiePigman, false);
return true;
}
return true;
diff --git a/src/Mobs/Rabbit.cpp b/src/Mobs/Rabbit.cpp
index c7f3d58f0..9d10212bf 100644
--- a/src/Mobs/Rabbit.cpp
+++ b/src/Mobs/Rabbit.cpp
@@ -10,7 +10,20 @@
cRabbit::cRabbit(void) :
- super("Rabbit", mtRabbit, "mob.rabbit.idle", "mob.rabbit.death", 0.82, 0.68)
+ cRabbit(static_cast<eRabbitType>(cFastRandom().NextInt(
+ static_cast<UInt8>(eRabbitType::SaltAndPepper) + 1 // Max possible Rabbit-Type
+ )), 0)
+{
+}
+
+
+
+
+
+cRabbit::cRabbit(eRabbitType Type, int MoreCarrotTicks) :
+ super("Rabbit", mtRabbit, "mob.rabbit.idle", "mob.rabbit.death", 0.82, 0.68),
+ m_Type(Type),
+ m_MoreCarrotTicks(MoreCarrotTicks)
{
}
diff --git a/src/Mobs/Rabbit.h b/src/Mobs/Rabbit.h
index e86c85579..56181e3d0 100644
--- a/src/Mobs/Rabbit.h
+++ b/src/Mobs/Rabbit.h
@@ -7,6 +7,21 @@
+enum class eRabbitType : UInt8
+{
+ Brown = 0,
+ White = 1,
+ Black = 2,
+ BlackAndWhite = 3,
+ Gold = 4,
+ SaltAndPepper = 5,
+ TheKillerBunny = 99
+};
+
+
+
+
+
class cRabbit :
public cPassiveMonster
{
@@ -14,11 +29,19 @@ class cRabbit :
public:
cRabbit();
+ cRabbit(eRabbitType Type, int MoreCarrotTicks = 0);
CLASS_PROTODEF(cRabbit)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
-
virtual const cItem GetFollowedItem(void) const override { return cItem(E_ITEM_CARROT); }
+ eRabbitType GetRabbitType() const { return m_Type; }
+ UInt8 GetRabbitTypeAsNumber() const { return static_cast<UInt8>(GetRabbitType()); }
+ int GetMoreCarrotTicks() const { return m_MoreCarrotTicks; }
+
+private:
+
+ eRabbitType m_Type;
+ int m_MoreCarrotTicks; // Ticks until the Rabbit eat planted Carrots
} ;
diff --git a/src/Mobs/Spider.cpp b/src/Mobs/Spider.cpp
index 184a1d912..a9da28750 100644
--- a/src/Mobs/Spider.cpp
+++ b/src/Mobs/Spider.cpp
@@ -3,7 +3,8 @@
#include "Spider.h"
-
+#include "../World.h"
+#include "../Entities/Player.h"
@@ -33,3 +34,42 @@ void cSpider::GetDrops(cItems & a_Drops, cEntity * a_Killer)
+
+void cSpider::EventSeePlayer(cEntity * a_Entity)
+{
+ if (!GetWorld()->IsChunkLighted(GetChunkX(), GetChunkZ()))
+ {
+ GetWorld()->QueueLightChunk(GetChunkX(), GetChunkZ());
+ return;
+ }
+
+ if (!static_cast<cPlayer *>(a_Entity)->IsGameModeCreative() && (GetWorld()->GetBlockBlockLight(this->GetPosition()) <= 9))
+ {
+ super::EventSeePlayer(a_Entity);
+ }
+}
+
+
+
+
+
+bool cSpider::DoTakeDamage(TakeDamageInfo & a_TDI)
+{
+ if (!super::DoTakeDamage(a_TDI))
+ {
+ return false;
+ }
+
+ // If the source of the damage is not from an pawn entity, switch to idle
+ if ((a_TDI.Attacker == nullptr) || !a_TDI.Attacker->IsPawn())
+ {
+ m_EMState = IDLE;
+ }
+ else
+ {
+ // If the source of the damage is from a pawn entity, chase that entity
+ m_EMState = CHASING;
+ }
+
+ return true;
+}
diff --git a/src/Mobs/Spider.h b/src/Mobs/Spider.h
index 24134c00f..4f9df7887 100644
--- a/src/Mobs/Spider.h
+++ b/src/Mobs/Spider.h
@@ -18,6 +18,8 @@ public:
CLASS_PROTODEF(cSpider)
virtual void GetDrops(cItems & a_Drops, cEntity * a_Killer = nullptr) override;
+ virtual void EventSeePlayer(cEntity *) override;
+ virtual bool DoTakeDamage(TakeDamageInfo & a_TDI) override;
} ;
diff --git a/src/Mobs/Villager.cpp b/src/Mobs/Villager.cpp
index e4953d546..9239575d0 100644
--- a/src/Mobs/Villager.cpp
+++ b/src/Mobs/Villager.cpp
@@ -41,7 +41,7 @@ bool cVillager::DoTakeDamage(TakeDamageInfo & a_TDI)
if (a_TDI.DamageType == dtLightning)
{
Destroy();
- m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtWitch);
+ m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), mtWitch, false);
return true;
}
return true;