summaryrefslogtreecommitdiffstats
path: root/src/Mobs/Wolf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Mobs/Wolf.cpp')
-rw-r--r--src/Mobs/Wolf.cpp65
1 files changed, 64 insertions, 1 deletions
diff --git a/src/Mobs/Wolf.cpp b/src/Mobs/Wolf.cpp
index e2be2a8d9..c40dbf5e3 100644
--- a/src/Mobs/Wolf.cpp
+++ b/src/Mobs/Wolf.cpp
@@ -5,6 +5,7 @@
#include "../World.h"
#include "../Entities/Player.h"
#include "../Items/ItemHandler.h"
+#include "../Items/ItemSpawnEgg.h"
@@ -16,7 +17,6 @@ cWolf::cWolf(void) :
m_IsTame(false),
m_IsBegging(false),
m_IsAngry(false),
- m_OwnerName(""),
m_CollarColor(E_META_DYE_ORANGE),
m_NotificationCooldown(0)
{
@@ -198,6 +198,10 @@ void cWolf::OnRightClicked(cPlayer & a_Player)
}
else if (IsTame())
{
+ if (a_Player.GetUUID() == m_OwnerUUID)
+ {
+ cMonster::RightClickFeed(a_Player);
+ }
// Feed the wolf, restoring its health, or dye its collar:
switch (EquippedItemType)
{
@@ -208,6 +212,10 @@ void cWolf::OnRightClicked(cPlayer & a_Player)
case E_ITEM_RAW_CHICKEN:
case E_ITEM_COOKED_CHICKEN:
case E_ITEM_ROTTEN_FLESH:
+ case E_ITEM_RAW_MUTTON:
+ case E_ITEM_RAW_RABBIT:
+ case E_ITEM_COOKED_RABBIT:
+ case E_ITEM_COOKED_MUTTON:
{
if (m_Health < m_MaxHealth)
{
@@ -217,6 +225,13 @@ void cWolf::OnRightClicked(cPlayer & a_Player)
a_Player.GetInventory().RemoveOneEquippedItem();
}
}
+ else if (a_Player.GetUUID() == m_OwnerUUID) // Is the player the owner of the dog?
+ {
+ if (IsBaby())
+ {
+ m_AgingTimer = FloorC(m_AgingTimer * 0.9);
+ }
+ }
break;
}
case E_ITEM_DYE:
@@ -231,6 +246,11 @@ void cWolf::OnRightClicked(cPlayer & a_Player)
}
break;
}
+ // Multiplication is handled in cMonster. Just prevents from sitting down.
+ case E_ITEM_SPAWN_EGG:
+ {
+ break;
+ }
default:
{
if (a_Player.GetUUID() == m_OwnerUUID) // Is the player the owner of the dog?
@@ -241,6 +261,21 @@ void cWolf::OnRightClicked(cPlayer & a_Player)
}
}
+ if ((EquippedItemType == E_ITEM_SPAWN_EGG) && (!IsTame()))
+ {
+ eMonsterType MonsterType = cItemSpawnEggHandler::ItemDamageToMonsterType(EquippedItem.m_ItemDamage);
+ if (
+ (MonsterType == m_MobType) &&
+ (m_World->SpawnMob(GetPosX(), GetPosY(), GetPosZ(), m_MobType, true) != cEntity::INVALID_ID)) // Spawning succeeded
+ {
+ if (!a_Player.IsGameModeCreative())
+ {
+ // The mob was spawned, "use" the item:
+ a_Player.GetInventory().RemoveOneEquippedItem();
+ }
+ }
+ }
+
m_World->BroadcastEntityMetadata(*this);
}
@@ -337,6 +372,8 @@ void cWolf::Tick(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
{
StopMovingToPosition();
}
+
+ cMonster::LoveTick();
}
@@ -400,3 +437,29 @@ void cWolf::InStateIdle(std::chrono::milliseconds a_Dt, cChunk & a_Chunk)
}
+
+
+
+void cWolf::InheritFromParents(cMonster * a_Parent1, cMonster * a_Parent2)
+{
+ const auto Parent1 = static_cast<cWolf *>(a_Parent1);
+ const auto Parent2 = static_cast<cWolf *>(a_Parent2);
+ if (Parent1->GetOwnerUUID() == Parent2->GetOwnerUUID())
+ {
+ SetOwner(Parent1->GetOwnerName(), Parent2->GetOwnerUUID());
+ }
+ else
+ {
+ auto Parent1Age = Parent1->GetAge();
+ auto Parent2Age = Parent2->GetAge();
+
+ if (Parent1Age > Parent2Age)
+ {
+ SetOwner(Parent2->GetOwnerName(), Parent2->GetOwnerUUID());
+ }
+ else
+ {
+ SetOwner(Parent1->GetOwnerName(), Parent1->GetOwnerUUID());
+ }
+ }
+}