1
0

Adding new monster types to enum and saving/loading for easier future implementation (#4941)

* added new monster types to enum
added string <-> enum conversion in namespace serializer
added loading functions
added to saving

* renamed zombie pigman to zombified piglins in enum

Co-authored-by: 12xx12 <12xx12100@gmail.com>
Co-authored-by: Tiger Wang <ziwei.tiger@outlook.com>
This commit is contained in:
12xx12
2020-11-23 00:41:13 +01:00
committed by GitHub
parent a0afd13233
commit e35519ec8a
18 changed files with 1716 additions and 462 deletions

View File

@@ -378,12 +378,20 @@ void cProtocol_1_11_0::SendSpawnMob(const cMonster & a_Mob)
{
ASSERT(m_State == 3); // In game mode?
const auto MobType = GetProtocolMobType(a_Mob.GetMobType());
// If the type is not valid in this protocol bail out:
if (MobType == 0)
{
return;
}
cPacketizer Pkt(*this, pktSpawnMob);
Pkt.WriteVarInt32(a_Mob.GetUniqueID());
// TODO: Bad way to write a UUID, and it's not a true UUID, but this is functional for now.
Pkt.WriteBEUInt64(0);
Pkt.WriteBEUInt64(a_Mob.GetUniqueID());
Pkt.WriteVarInt32(GetProtocolMobType(a_Mob.GetMobType()));
Pkt.WriteVarInt32(MobType);
Vector3d LastSentPos = a_Mob.GetLastSentPosition();
Pkt.WriteBEDouble(LastSentPos.x);
Pkt.WriteBEDouble(LastSentPos.y);
@@ -543,7 +551,7 @@ cProtocol::Version cProtocol_1_11_0::GetProtocolVersion()
UInt32 cProtocol_1_11_0::GetProtocolMobType(eMonsterType a_MobType)
UInt32 cProtocol_1_11_0::GetProtocolMobType(const eMonsterType a_MobType)
{
switch (a_MobType)
{
@@ -555,26 +563,38 @@ UInt32 cProtocol_1_11_0::GetProtocolMobType(eMonsterType a_MobType)
case mtChicken: return 93;
case mtCow: return 92;
case mtCreeper: return 50;
case mtDonkey: return 31;
case mtEnderDragon: return 63;
case mtEnderman: return 58;
case mtEndermite: return 67;
case mtEvoker: return 34;
case mtGhast: return 56;
case mtGiant: return 53;
case mtGuardian: return 68;
case mtHorse: return 100;
case mtHusk: return 23;
case mtIronGolem: return 99;
case mtLlama: return 103;
case mtMagmaCube: return 62;
case mtMooshroom: return 96;
case mtMule: return 32;
case mtOcelot: return 98;
case mtPig: return 90;
case mtPolarBear: return 102;
case mtRabbit: return 101;
case mtSheep: return 91;
case mtShulker: return 69;
case mtSilverfish: return 60;
case mtSkeleton: return 51;
case mtSlime: return 55;
case mtSnowGolem: return 97;
case mtSpider: return 52;
case mtStray: return 6;
case mtTraderLlama: return 103;
case mtSquid: return 94;
case mtVex: return 35;
case mtVillager: return 120;
case mtVindicator: return 36;
case mtWitch: return 66;
case mtWither: return 64;
case mtWitherSkeleton: return 5;
@@ -582,8 +602,9 @@ UInt32 cProtocol_1_11_0::GetProtocolMobType(eMonsterType a_MobType)
case mtZombie: return 54;
case mtZombiePigman: return 57;
case mtZombieVillager: return 27;
default: return 0;
}
UNREACHABLE("Unsupported mob type");
}
@@ -837,7 +858,7 @@ void cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
{
using namespace Metadata_1_11;
// Living Enitiy Metadata
// Living entity Metadata
if (a_Mob.HasCustomName())
{
// TODO: As of 1.9 _all_ entities can have custom names; should this be moved up?
@@ -929,7 +950,7 @@ void cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
case mtHorse:
{
// XXX This behaves incorrectly with different varients; horses have different entity IDs now
// XXX This behaves incorrectly with different variants; horses have different entity IDs now
// Abstract horse
auto & Horse = static_cast<const cHorse &>(a_Mob);
@@ -996,6 +1017,7 @@ void cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
case mtOcelot:
{
// Todo: move unnecessary to cat
auto & Ocelot = static_cast<const cOcelot &>(a_Mob);
a_Pkt.WriteBEUInt8(AGEABLE_BABY);
@@ -1153,7 +1175,7 @@ void cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
case mtZombie:
{
// XXX Zombies were also split into new sublcasses; this doesn't handle that.
// XXX Zombies were also split into new subclasses; this doesn't handle that.
auto & Zombie = static_cast<const cZombie &>(a_Mob);
a_Pkt.WriteBEUInt8(ZOMBIE_IS_BABY);
a_Pkt.WriteBEUInt8(METADATA_TYPE_BOOL);
@@ -1187,7 +1209,62 @@ void cProtocol_1_11_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
break;
} // case mtZombieVillager
default: break;
case mtBlaze:
case mtElderGuardian:
case mtGuardian:
case mtSnowGolem:
{
// TODO: Mobs with extra fields that aren't implemented
break;
}
case mtCat:
case mtDonkey:
case mtMule:
case mtEndermite:
case mtEvoker:
case mtLlama:
case mtPolarBear:
case mtShulker:
case mtSkeletonHorse:
case mtZombieHorse:
case mtVex:
case mtVindicator:
{
// Todo: Mobs not added yet. Grouped ones have the same metadata
UNREACHABLE("cProtocol_1_11::WriteMobMetadata: received unimplemented type");
break;
}
case mtCaveSpider:
case mtEnderDragon:
case mtGiant:
case mtIronGolem:
case mtMooshroom:
case mtSilverfish:
case mtSkeleton:
case mtStray:
case mtSpider:
case mtSquid:
case mtWitherSkeleton:
{
// Mobs without additional metadata
break;
}
case mtInvalidType:
{
break;
}
default: UNREACHABLE("cProtocol_1_11::WriteMobMetadata: received mob of invalid type");
} // switch (a_Mob.GetType())
}