summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Mobs/Rabbit.cpp15
-rw-r--r--src/Mobs/Rabbit.h25
-rw-r--r--src/Protocol/Protocol18x.cpp19
-rw-r--r--src/WorldStorage/NBTChunkSerializer.cpp91
-rwxr-xr-xsrc/WorldStorage/WSSAnvil.cpp13
5 files changed, 109 insertions, 54 deletions
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/Protocol/Protocol18x.cpp b/src/Protocol/Protocol18x.cpp
index f4f32dfdb..e8acf8bd4 100644
--- a/src/Protocol/Protocol18x.cpp
+++ b/src/Protocol/Protocol18x.cpp
@@ -3437,14 +3437,6 @@ void cProtocol180::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob)
break;
} // case mtPig
- case mtRabbit:
- {
- auto & Rabbit = reinterpret_cast<const cRabbit &>(a_Mob);
- a_Pkt.WriteBEUInt8(0x0c);
- a_Pkt.WriteBEInt8(Rabbit.GetAge());
- break;
- } // case mtRabbit
-
case mtSheep:
{
auto & Sheep = reinterpret_cast<const cSheep &>(a_Mob);
@@ -3462,6 +3454,17 @@ void cProtocol180::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob)
break;
} // case mtSheep
+ case mtRabbit:
+ {
+ auto & Rabbit = reinterpret_cast<const cRabbit &>(a_Mob);
+ a_Pkt.WriteBEUInt8(0x12);
+ a_Pkt.WriteBEUInt8(Rabbit.GetRabbitTypeAsNumber());
+
+ a_Pkt.WriteBEUInt8(0x0c);
+ a_Pkt.WriteBEInt8(Rabbit.GetAge());
+ break;
+ } // case mtRabbit
+
case mtSkeleton:
{
auto & Skeleton = reinterpret_cast<const cSkeleton &>(a_Mob);
diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp
index 234c60d62..cfbbcd0b4 100644
--- a/src/WorldStorage/NBTChunkSerializer.cpp
+++ b/src/WorldStorage/NBTChunkSerializer.cpp
@@ -528,113 +528,118 @@ void cNBTChunkSerializer::AddMonsterEntity(cMonster * a_Monster)
{
case mtBat:
{
- m_Writer.AddByte("BatFlags", ((const cBat *)a_Monster)->IsHanging());
+ m_Writer.AddByte("BatFlags", reinterpret_cast<const cBat *>(a_Monster)->IsHanging());
break;
}
case mtCreeper:
{
- m_Writer.AddByte("powered", ((const cCreeper *)a_Monster)->IsCharged());
- m_Writer.AddByte("ignited", ((const cCreeper *)a_Monster)->IsBlowing());
+ const cCreeper *Creeper = reinterpret_cast<const cCreeper *>(a_Monster);
+ m_Writer.AddByte("powered", Creeper->IsCharged());
+ m_Writer.AddByte("ignited", Creeper->IsBlowing());
break;
}
case mtEnderman:
{
- m_Writer.AddShort("carried", (Int16)((const cEnderman *)a_Monster)->GetCarriedBlock());
- m_Writer.AddShort("carriedData", (Int16)((const cEnderman *)a_Monster)->GetCarriedMeta());
+ const cEnderman *Enderman = reinterpret_cast<const cEnderman *>(a_Monster);
+ m_Writer.AddShort("carried", (Int16) Enderman->GetCarriedBlock());
+ m_Writer.AddShort("carriedData", (Int16) Enderman->GetCarriedMeta());
break;
}
case mtHorse:
{
- const cHorse & Horse = *((const cHorse *)a_Monster);
- m_Writer.AddByte("ChestedHorse", Horse.IsChested());
- m_Writer.AddByte("EatingHaystack", Horse.IsEating());
- m_Writer.AddByte("Tame", Horse.IsTame());
- m_Writer.AddInt ("Type", Horse.GetHorseType());
- m_Writer.AddInt ("Color", Horse.GetHorseColor());
- m_Writer.AddInt ("Style", Horse.GetHorseStyle());
- m_Writer.AddInt ("ArmorType", Horse.GetHorseArmour());
- m_Writer.AddByte("Saddle", Horse.IsSaddled());
- m_Writer.AddByte("Age", Horse.GetAge());
+ const cHorse *Horse = reinterpret_cast<const cHorse *>(a_Monster);
+ m_Writer.AddByte("ChestedHorse", Horse->IsChested());
+ m_Writer.AddByte("EatingHaystack", Horse->IsEating());
+ m_Writer.AddByte("Tame", Horse->IsTame());
+ m_Writer.AddInt ("Type", Horse->GetHorseType());
+ m_Writer.AddInt ("Color", Horse->GetHorseColor());
+ m_Writer.AddInt ("Style", Horse->GetHorseStyle());
+ m_Writer.AddInt ("ArmorType", Horse->GetHorseArmour());
+ m_Writer.AddByte("Saddle", Horse->IsSaddled());
+ m_Writer.AddByte("Age", Horse->GetAge());
break;
}
case mtMagmaCube:
{
- m_Writer.AddInt("Size", ((const cMagmaCube *)a_Monster)->GetSize());
+ m_Writer.AddInt("Size", reinterpret_cast<const cMagmaCube *>(a_Monster)->GetSize());
break;
}
case mtSheep:
{
- m_Writer.AddByte("Sheared", ((const cSheep *)a_Monster)->IsSheared());
- m_Writer.AddByte("Color", ((const cSheep *)a_Monster)->GetFurColor());
- m_Writer.AddByte("Age", ((const cSheep *)a_Monster)->GetAge());
+ const cSheep *Sheep = reinterpret_cast<const cSheep *>(a_Monster);
+ m_Writer.AddByte("Sheared", Sheep->IsSheared());
+ m_Writer.AddByte("Color", Sheep->GetFurColor());
+ m_Writer.AddByte("Age", Sheep->GetAge());
break;
}
case mtSlime:
{
- m_Writer.AddInt("Size", ((const cSlime *)a_Monster)->GetSize());
+ m_Writer.AddInt("Size", reinterpret_cast<const cSlime *>(a_Monster)->GetSize());
break;
}
case mtSkeleton:
{
- m_Writer.AddByte("SkeletonType", (((const cSkeleton *)a_Monster)->IsWither() ? 1 : 0));
+ m_Writer.AddByte("SkeletonType", (reinterpret_cast<const cSkeleton *>(a_Monster)->IsWither() ? 1 : 0));
break;
}
case mtVillager:
{
- m_Writer.AddInt("Profession", ((const cVillager *)a_Monster)->GetVilType());
- m_Writer.AddByte("Age", ((const cVillager *)a_Monster)->GetAge());
+ const cVillager *Villager = reinterpret_cast<const cVillager *>(a_Monster);
+ m_Writer.AddInt("Profession", Villager->GetVilType());
+ m_Writer.AddByte("Age", Villager->GetAge());
break;
}
case mtWither:
{
- m_Writer.AddInt("Invul", ((const cWither *)a_Monster)->GetWitherInvulnerableTicks());
+ m_Writer.AddInt("Invul", reinterpret_cast<const cWither *>(a_Monster)->GetWitherInvulnerableTicks());
break;
}
case mtWolf:
{
- const cWolf & Wolf = *((cWolf *)a_Monster);
- if (!Wolf.GetOwnerName().empty())
+ const cWolf *Wolf = reinterpret_cast<const cWolf *>(a_Monster);
+ if (!Wolf->GetOwnerName().empty())
{
- m_Writer.AddString("Owner", Wolf.GetOwnerName());
+ m_Writer.AddString("Owner", Wolf->GetOwnerName());
}
- if (!Wolf.GetOwnerUUID().empty())
+ if (!Wolf->GetOwnerUUID().empty())
{
- m_Writer.AddString("OwnerUUID", Wolf.GetOwnerUUID());
+ m_Writer.AddString("OwnerUUID", Wolf->GetOwnerUUID());
}
- m_Writer.AddByte("Sitting", Wolf.IsSitting() ? 1 : 0);
- m_Writer.AddByte("Angry", Wolf.IsAngry() ? 1 : 0);
- m_Writer.AddByte("CollarColor", (unsigned char)Wolf.GetCollarColor());
- m_Writer.AddByte("Age", Wolf.GetAge());
+ m_Writer.AddByte("Sitting", Wolf->IsSitting() ? 1 : 0);
+ m_Writer.AddByte("Angry", Wolf->IsAngry() ? 1 : 0);
+ m_Writer.AddByte("CollarColor", (unsigned char) Wolf->GetCollarColor());
+ m_Writer.AddByte("Age", Wolf->GetAge());
break;
}
case mtZombie:
{
- m_Writer.AddByte("IsVillager", (((const cZombie *)a_Monster)->IsVillagerZombie() ? 1 : 0));
- m_Writer.AddByte("IsConverting", (((const cZombie *)a_Monster)->IsConverting() ? 1 : 0));
- m_Writer.AddByte("Age", (((const cZombie *)a_Monster)->GetAge()));
+ const cZombie *Zombie = reinterpret_cast<const cZombie *>(a_Monster);
+ m_Writer.AddByte("IsVillager", Zombie->IsVillagerZombie() ? 1 : 0);
+ m_Writer.AddByte("IsConverting", Zombie->IsConverting() ? 1 : 0);
+ m_Writer.AddByte("Age", Zombie->GetAge());
break;
}
case mtZombiePigman:
{
- m_Writer.AddByte("Age", (((const cZombiePigman *)a_Monster)->GetAge()));
+ m_Writer.AddByte("Age", reinterpret_cast<const cZombiePigman *>(a_Monster)->GetAge());
break;
}
case mtOcelot:
{
- const cOcelot & Ocelot = *((cOcelot *)a_Monster);
- m_Writer.AddByte("Age", Ocelot.GetAge());
+ m_Writer.AddByte("Age", reinterpret_cast<const cOcelot *>(a_Monster)->GetAge());
break;
}
case mtPig:
{
- const cPig & Pig = *((cPig *)a_Monster);
- m_Writer.AddByte("Age", Pig.GetAge());
+ m_Writer.AddByte("Age", reinterpret_cast<const cPig *>(a_Monster)->GetAge());
break;
}
case mtRabbit:
{
- const cRabbit & Rabbit = *((cRabbit *)a_Monster);
- m_Writer.AddByte("Age", Rabbit.GetAge());
+ const cRabbit *Rabbit = reinterpret_cast<const cRabbit *>(a_Monster);
+ m_Writer.AddInt("RabbitType", Rabbit->GetRabbitTypeAsNumber());
+ m_Writer.AddInt("MoreCarrotTicks", Rabbit->GetMoreCarrotTicks());
+ m_Writer.AddByte("Age", Rabbit->GetAge());
break;
}
case mtInvalidType:
diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp
index 62918f44e..54071b9df 100755
--- a/src/WorldStorage/WSSAnvil.cpp
+++ b/src/WorldStorage/WSSAnvil.cpp
@@ -2396,7 +2396,18 @@ void cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
void cWSSAnvil::LoadRabbitFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
- std::unique_ptr<cRabbit> Monster = cpp14::make_unique<cRabbit>();
+ int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "RabbitType");
+ int MoreCarrotTicksIdx = a_NBT.FindChildByName(a_TagIdx, "MoreCarrotTicks");
+
+ if ((TypeIdx < 0) || (MoreCarrotTicksIdx < 0))
+ {
+ return;
+ }
+
+ int Type = a_NBT.GetInt(TypeIdx);
+ int MoreCarrotTicks = a_NBT.GetInt(MoreCarrotTicksIdx);
+
+ std::unique_ptr<cRabbit> Monster = cpp14::make_unique<cRabbit>(static_cast<eRabbitType>(Type), MoreCarrotTicks);
if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))
{
return;