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
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 1716 additions and 462 deletions

View File

@ -17022,10 +17022,18 @@ end
{
Notes = "",
},
mtCat =
{
Notes = "",
},
mtChicken =
{
Notes = "",
},
mtCod =
{
Notes = "",
},
mtCow =
{
Notes = "",
@ -17034,6 +17042,22 @@ end
{
Notes = "",
},
mtDolphin =
{
Notes = "",
},
mtDonkey =
{
Notes = "",
},
mtDrowned =
{
Notes = "",
},
mtElderGuardian =
{
Notes = "",
},
mtEnderDragon =
{
Notes = "",
@ -17042,6 +17066,18 @@ end
{
Notes = "",
},
mtEndermite =
{
Notes = "",
},
mtEvoker =
{
Notes = "",
},
mtFox =
{
Notes = "",
},
mtGhast =
{
Notes = "",
@ -17050,10 +17086,22 @@ end
{
Notes = "",
},
mtHoglin =
{
Notes = "",
},
mtHorse =
{
Notes = "",
},
mtHusk =
{
Notes = "",
},
mtIllusioner =
{
Notes = "",
},
mtInvalidType =
{
Notes = "Invalid monster type. Returned when monster type not recognized",
@ -17062,6 +17110,10 @@ end
{
Notes = "",
},
mtLlama =
{
Notes = "",
},
mtMagmaCube =
{
Notes = "",
@ -17070,18 +17122,66 @@ end
{
Notes = "",
},
mtMule =
{
Notes = "",
},
mtOcelot =
{
Notes = "",
},
mtPanda =
{
Notes = "",
},
mtParrot =
{
Notes = "",
},
mtPhantom =
{
Notes = "",
},
mtPig =
{
Notes = "",
},
mtPiglin =
{
Notes = "",
},
mtPiglinBrute =
{
Notes = "",
},
mtPillager =
{
Notes = "",
},
mtPolarBear =
{
Notes = "",
},
mtPufferfish =
{
Notes = "",
},
mtRavager =
{
Notes = "",
},
mtSalmon =
{
Notes = "",
},
mtSheep =
{
Notes = "",
},
mtShulker =
{
Notes = "",
},
mtSilverfish =
{
Notes = "",
@ -17090,10 +17190,22 @@ end
{
Notes = "",
},
mtSkeletonHorse =
{
Notes = "",
},
mtSlime =
{
Notes = "",
},
mtStray =
{
Notes = "",
},
mtStrider =
{
Notes = "",
},
mtSnowGolem =
{
Notes = "",
@ -17106,10 +17218,34 @@ end
{
Notes = "",
},
mtTraderLlama =
{
Notes = "",
},
mtTropicalFish =
{
Notes = "",
},
mtTurtle =
{
Notes = "",
},
mtVex =
{
Notes = "",
},
mtVillager =
{
Notes = "",
},
mtVindicator =
{
Notes = "",
},
mtWanderingTrader =
{
Notes = "",
},
mtWitch =
{
Notes = "",
@ -17126,14 +17262,26 @@ end
{
Notes = "",
},
mtZoglin =
{
Notes = "",
},
mtZombie =
{
Notes = "",
},
mtZombieHorse =
{
Notes = "",
},
mtZombiePigman =
{
Notes = "",
},
mtZombifiedPiglin =
{
Notes = "",
},
mtZombieVillager =
{
Notes = "",

View File

@ -1064,39 +1064,75 @@ cMonster::eFamily cMonster::FamilyFromType(eMonsterType a_Type)
switch (a_Type)
{
case mtBat: return mfAmbient;
case mtBlaze: return mfHostile;
case mtCaveSpider: return mfHostile;
case mtChicken: return mfPassive;
case mtCow: return mfPassive;
case mtCreeper: return mfHostile;
case mtEnderDragon: return mfNoSpawn;
case mtEnderman: return mfHostile;
case mtGhast: return mfHostile;
case mtGiant: return mfNoSpawn;
case mtGuardian: return mfWater; // Just because they have special spawning conditions. If Watertemples have been added, this needs to be edited!
case mtHorse: return mfPassive;
case mtIronGolem: return mfPassive;
case mtMagmaCube: return mfHostile;
case mtMooshroom: return mfPassive;
case mtOcelot: return mfPassive;
case mtPig: return mfPassive;
case mtRabbit: return mfPassive;
case mtSheep: return mfPassive;
case mtSilverfish: return mfHostile;
case mtSkeleton: return mfHostile;
case mtSlime: return mfHostile;
case mtSnowGolem: return mfNoSpawn;
case mtSpider: return mfHostile;
case mtSquid: return mfWater;
case mtVillager: return mfPassive;
case mtWitch: return mfHostile;
case mtWither: return mfNoSpawn;
case mtWitherSkeleton: return mfHostile;
case mtWolf: return mfPassive;
case mtZombie: return mfHostile;
case mtZombiePigman: return mfHostile;
case mtZombieVillager: return mfHostile;
case mtBat: return mfAmbient;
case mtBlaze: return mfHostile;
case mtCat: return mfPassive;
case mtCaveSpider: return mfHostile;
case mtChicken: return mfPassive;
case mtCod: return mfWater;
case mtCow: return mfPassive;
case mtCreeper: return mfHostile;
case mtDolphin: return mfWater;
case mtDonkey: return mfPassive;
case mtDrowned: return mfHostile;
case mtElderGuardian: return mfHostile;
case mtEnderDragon: return mfNoSpawn;
case mtEnderman: return mfHostile;
case mtEndermite: return mfHostile;
case mtEvoker: return mfHostile;
case mtFox: return mfPassive;
case mtGhast: return mfHostile;
case mtGiant: return mfNoSpawn;
case mtGuardian: return mfWater; // Just because they have special spawning conditions. TODO: If Watertemples have been added, this needs to be edited!
case mtHoglin: return mfHostile;
case mtHorse: return mfPassive;
case mtHusk: return mfHostile;
case mtIllusioner: return mfHostile;
case mtIronGolem: return mfPassive;
case mtLlama: return mfPassive;
case mtMagmaCube: return mfHostile;
case mtMooshroom: return mfPassive;
case mtMule: return mfPassive;
case mtOcelot: return mfPassive;
case mtPanda: return mfPassive;
case mtParrot: return mfPassive;
case mtPhantom: return mfHostile;
case mtPig: return mfPassive;
case mtPiglin: return mfHostile;
case mtPiglinBrute: return mfHostile;
case mtPillager: return mfHostile;
case mtPolarBear: return mfPassive;
case mtPufferfish: return mfWater;
case mtRabbit: return mfPassive;
case mtRavager: return mfHostile;
case mtSalmon: return mfWater;
case mtSheep: return mfPassive;
case mtShulker: return mfHostile;
case mtSilverfish: return mfHostile;
case mtSkeleton: return mfHostile;
case mtSkeletonHorse: return mfPassive;
case mtSlime: return mfHostile;
case mtSnowGolem: return mfNoSpawn;
case mtSpider: return mfHostile;
case mtSquid: return mfWater;
case mtStray: return mfHostile;
case mtStrider: return mfHostile;
case mtTraderLlama: return mfPassive;
case mtTropicalFish: return mfWater;
case mtTurtle: return mfWater; // I'm not quite sure
case mtVex: return mfHostile;
case mtVindicator: return mfHostile;
case mtVillager: return mfPassive;
case mtWanderingTrader: return mfPassive;
case mtWitch: return mfHostile;
case mtWither: return mfNoSpawn;
case mtWitherSkeleton: return mfHostile;
case mtWolf: return mfPassive;
case mtZoglin: return mfHostile;
case mtZombie: return mfHostile;
case mtZombieHorse: return mfPassive;
case mtZombiePigman: return mfHostile;
case mtZombieVillager: return mfHostile;
default:
{

View File

@ -13,37 +13,76 @@ enum eMonsterType
mtBat,
mtBlaze,
mtCat, // Added in 1.14
mtCaveSpider,
mtChicken,
mtCod, // Added in 1.13
mtCow,
mtCreeper,
mtDolphin, // Added in 1.13
mtDonkey, // Added in 1.6
mtDrowned, // Added in 1.13
mtElderGuardian, // Added in 1.13
mtEnderDragon,
mtEnderman,
mtEndermite, // Added in 1.8
mtEvoker, // Added in 1.11
mtFox, // Added in 1.14
mtGhast,
mtGiant,
mtGuardian,
mtHorse,
mtHoglin, // Added in 1.16
mtHusk, // Added in 1.10
mtIllusioner, // Added in 1.12
mtIronGolem,
mtLlama, // Added in 1.11
mtMagmaCube,
mtMooshroom,
mtMule, // Added in 1.6
mtOcelot,
mtPanda, // Added in 1.14
mtParrot, // Added in 1.12
mtPhantom, // Added in 1.13
mtPig,
mtPiglin, // Added in 1.16
mtPiglinBrute, // Added in 1.16
mtPillager, // Added in 1.14
mtPolarBear, // Added in 1.10
mtPufferfish, // Added in 1.13
mtRabbit,
mtRavager, // Added in 1.14
mtSalmon, // Added in 1.13
mtSheep,
mtShulker, // Added in 1.9
mtSilverfish,
mtSkeleton,
mtSkeletonHorse,
mtSlime,
mtSnowGolem,
mtSpider,
mtSquid,
mtStray, // Added in 1.10
mtStrider, // Added in 1.16
mtTraderLlama, // Added in 1.11
mtTropicalFish, // Added in 1.13
mtTurtle, // Added in 1.13
mtVex, // Added in 1.11
mtVillager,
mtVindicator, // Added in 1.11
mtWanderingTrader, // Added in 1.14
mtWitch,
mtWither,
mtWitherSkeleton,
mtWolf,
mtZoglin, // Added in 1.16
mtZombie,
mtZombiePigman,
mtZombieHorse, // Added in 1.6
mtZombifiedPiglin,
mtZombieVillager,
// Synonyms:
mtZombiePigman = mtZombifiedPiglin,
} ;
// tolua_end

View File

@ -337,6 +337,19 @@ cProtocol::Version cProtocol_1_10_0::GetProtocolVersion()
UInt32 cProtocol_1_10_0::GetProtocolMobType(const eMonsterType a_MobType)
{
switch (a_MobType)
{
case mtPolarBear: return 102;
default: return Super::GetProtocolMobType(a_MobType);
}
}
void cProtocol_1_10_0::HandlePacketResourcePackStatus(cByteBuffer & a_ByteBuffer)
{
HANDLE_READ(a_ByteBuffer, ReadBEUInt8, UInt8, Status);
@ -677,7 +690,7 @@ void cProtocol_1_10_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
{
using namespace Metadata;
// 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?
@ -975,6 +988,7 @@ void cProtocol_1_10_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
break;
} // case mtWolf
case mtHusk:
case mtZombie:
{
auto & Zombie = static_cast<const cZombie &>(a_Mob);
@ -1018,6 +1032,50 @@ void cProtocol_1_10_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_
break;
} // case mtZombieVillager
default: break;
case mtBlaze:
case mtElderGuardian:
case mtGuardian:
{
// TODO: Mobs with extra fields that aren't implemented
break;
}
case mtCat:
case mtEndermite:
case mtPolarBear:
case mtShulker:
case mtDonkey:
case mtMule:
case mtSkeletonHorse:
case mtZombieHorse:
{
// Todo: Mobs not added yet. Grouped ones have the same metadata
UNREACHABLE("cProtocol_1_10::WriteMobMetadata: received unimplemented type");
break;
}
case mtCaveSpider:
case mtEnderDragon:
case mtGiant:
case mtIronGolem:
case mtMooshroom:
case mtSilverfish:
case mtSkeleton:
case mtSnowGolem:
case mtStray:
case mtSpider:
case mtSquid:
{
// Entities without additional metadata
break;
}
case mtInvalidType:
{
break;
}
default: UNREACHABLE("cProtocol_1_10::WriteMobMetadata: received mob of invalid type");
} // switch (a_Mob.GetType())
}

View File

@ -33,6 +33,7 @@ protected:
virtual void SendSoundEffect(const AString & a_SoundName, double a_X, double a_Y, double a_Z, float a_Volume, float a_Pitch) override;
virtual Version GetProtocolVersion() override;
virtual UInt32 GetProtocolMobType(eMonsterType a_MobType) override;
virtual void HandlePacketResourcePackStatus(cByteBuffer & a_ByteBuffer) override;
virtual void WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a_Entity) override;
virtual void WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob) override;

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())
}

View File

@ -550,7 +550,7 @@ void cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
{
using namespace Metadata_1_12;
// 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?
@ -642,7 +642,7 @@ void cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
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);
@ -866,7 +866,7 @@ void cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
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);
@ -907,28 +907,64 @@ void cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
} // case mtZombieVillager
case mtBlaze:
case mtCaveSpider:
case mtElderGuardian:
case mtEnderDragon:
case mtGuardian:
case mtIronGolem:
case mtSnowGolem:
case mtSpider:
case mtWitherSkeleton:
{
// TODO: Mobs with extra fields that aren't implemented
break;
}
case mtMooshroom:
case mtCaveSpider:
{
// Not mentioned on http://wiki.vg/Entities
break;
}
case mtCat:
case mtDonkey:
case mtMule:
case mtEndermite:
case mtEvoker:
case mtHusk:
case mtIllusioner:
case mtLlama:
case mtParrot:
case mtPolarBear:
case mtShulker:
case mtSkeletonHorse:
case mtZombieHorse:
case mtStray:
case mtVex:
case mtVindicator:
{
// Todo: Mobs not added yet. Grouped ones have the same metadata
UNREACHABLE("cProtocol_1_12::WriteMobMetadata: received unimplemented type");
break;
}
case mtGiant:
case mtSilverfish:
case mtSkeleton:
case mtSquid:
case mtWitherSkeleton:
{
// Mobs with no extra fields
break;
@ -936,9 +972,9 @@ void cProtocol_1_12::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
case mtInvalidType:
{
ASSERT(!"cProtocol_1_12::WriteMobMetadata: Recieved mob of invalid type");
break;
}
default: UNREACHABLE("cProtocol_1_12::WriteMobMetadata: received mob of invalid type");
} // switch (a_Mob.GetType())
}
@ -1035,6 +1071,20 @@ cProtocol::Version cProtocol_1_12::GetProtocolVersion()
UInt32 cProtocol_1_12::GetProtocolMobType(const eMonsterType a_MobType)
{
switch (a_MobType)
{
case mtIllusioner: return 37;
case mtParrot: return 105;
default: return Super::GetProtocolMobType(a_MobType);
}
}
bool cProtocol_1_12::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)
{
switch (m_State)

View File

@ -36,6 +36,7 @@ protected:
virtual UInt32 GetPacketID(ePacketType a_Packet) override;
virtual Version GetProtocolVersion() override;
virtual UInt32 GetProtocolMobType(eMonsterType a_MobType) override;
virtual bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) override;
virtual void HandlePacketAdvancementTab(cByteBuffer & a_ByteBuffer);
virtual void HandleCraftRecipe(cByteBuffer & a_ByteBuffer);

View File

@ -406,38 +406,65 @@ UInt32 cProtocol_1_13::GetProtocolMobType(eMonsterType a_MobType)
// Map invalid type to Giant for easy debugging (if this ever spawns, something has gone very wrong)
case mtInvalidType: return 27;
case mtBat: return 3;
case mtCat: return 48;
case mtBlaze: return 4;
case mtCaveSpider: return 6;
case mtChicken: return 7;
case mtCod: return 8;
case mtCow: return 9;
case mtCreeper: return 10;
case mtDonkey: return 11;
case mtDolphin: return 12;
case mtDrowned: return 14;
case mtElderGuardian: return 15;
case mtEnderDragon: return 17;
case mtEnderman: return 18;
case mtEndermite: return 19;
case mtEvoker: return 21;
case mtGhast: return 26;
case mtGiant: return 27;
case mtGuardian: return 28;
case mtHorse: return 29;
case mtHusk: return 30;
case mtIllusioner: return 31;
case mtIronGolem: return 80;
case mtLlama: return 36;
case mtMagmaCube: return 38;
case mtMule: return 46;
case mtMooshroom: return 47;
case mtOcelot: return 48;
case mtParrot: return 50;
case mtPhantom: return 90;
case mtPig: return 51;
case mtPufferfish: return 52;
case mtPolarBear: return 54;
case mtRabbit: return 56;
case mtSalmon: return 57;
case mtSheep: return 58;
case mtShulker: return 59;
case mtSilverfish: return 61;
case mtSkeleton: return 62;
case mtSkeletonHorse: return 63;
case mtSlime: return 64;
case mtSnowGolem: return 66;
case mtSpider: return 69;
case mtSquid: return 70;
case mtStray: return 71;
case mtTropicalFish: return 72;
case mtTurtle: return 73;
case mtVex: return 78;
case mtVillager: return 79;
case mtVindicator: return 81;
case mtWitch: return 82;
case mtWither: return 83;
case mtWitherSkeleton: return 84;
case mtWolf: return 86;
case mtZombie: return 87;
case mtZombiePigman: return 53;
case mtZombieHorse: return 88;
case mtZombieVillager: return 89;
default: return 0;
}
UNREACHABLE("Unsupported mob type");
}
@ -1222,7 +1249,6 @@ void cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
case mtBlaze:
case mtEnderDragon:
case mtGuardian:
case mtIronGolem:
case mtSnowGolem:
case mtSpider:
@ -1232,6 +1258,62 @@ void cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
break;
}
case mtCat:
case mtCod:
case mtDolphin:
case mtDonkey:
case mtDrowned:
case mtElderGuardian:
case mtGuardian:
case mtEndermite:
case mtEvoker:
case mtIllusioner:
case mtLlama:
case mtMule:
case mtParrot:
case mtPhantom:
case mtPolarBear:
case mtPufferfish:
case mtSalmon:
case mtShulker:
case mtStray:
case mtSkeletonHorse:
case mtZombieHorse:
case mtTropicalFish:
case mtTurtle:
case mtVex:
case mtVindicator:
case mtHusk:
{
// Todo: Mobs not added yet. Grouped ones have the same metadata
UNREACHABLE("cProtocol_1_13::WriteMobMetadata: received unimplemented type");
break;
}
case mtMooshroom:
case mtCaveSpider:
{
@ -1251,9 +1333,9 @@ void cProtocol_1_13::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mo
case mtInvalidType:
{
ASSERT(!"cProtocol_1_13::WriteMobMetadata: Recieved mob of invalid type");
break;
}
default: UNREACHABLE("cProtocol_1_13::WriteMobMetadata: received mob of invalid type");
} // switch (a_Mob.GetType())
}

View File

@ -1388,9 +1388,17 @@ void cProtocol_1_8_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());
Pkt.WriteBEUInt8(static_cast<Byte>(GetProtocolMobType(a_Mob.GetMobType())));
Pkt.WriteBEUInt8(static_cast<Byte>(MobType));
Vector3d LastSentPos = a_Mob.GetLastSentPosition();
Pkt.WriteFPInt(LastSentPos.x);
Pkt.WriteFPInt(LastSentPos.y);
@ -1876,7 +1884,7 @@ int cProtocol_1_8_0::GetParticleID(const AString & a_ParticleName)
UInt32 cProtocol_1_8_0::GetProtocolMobType(eMonsterType a_MobType)
UInt32 cProtocol_1_8_0::GetProtocolMobType(const eMonsterType a_MobType)
{
switch (a_MobType)
{
@ -1890,6 +1898,7 @@ UInt32 cProtocol_1_8_0::GetProtocolMobType(eMonsterType a_MobType)
case mtCreeper: return 50;
case mtEnderDragon: return 63;
case mtEnderman: return 58;
case mtEndermite: return 67;
case mtGhast: return 56;
case mtGiant: return 53;
case mtGuardian: return 68;
@ -1915,8 +1924,18 @@ UInt32 cProtocol_1_8_0::GetProtocolMobType(eMonsterType a_MobType)
case mtZombie: return 54;
case mtZombiePigman: return 57;
case mtZombieVillager: return 27;
// Mobs that get replaced with another because they were added later
case mtCat: return GetProtocolMobType(mtOcelot);
case mtDonkey: return GetProtocolMobType(mtHorse);
case mtMule: return GetProtocolMobType(mtHorse);
case mtSkeletonHorse: return GetProtocolMobType(mtHorse);
case mtZombieHorse: return GetProtocolMobType(mtHorse);
case mtStray: return GetProtocolMobType(mtSkeleton);
case mtHusk: return GetProtocolMobType(mtZombie);
default: return 0;
}
UNREACHABLE("Unsupported mob type");
}
@ -3792,6 +3811,14 @@ void cProtocol_1_8_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_M
break;
} // case mtSlime
case mtSkeleton:
case mtStray:
{
a_Pkt.WriteBEUInt8(0x0d);
a_Pkt.WriteBEUInt8(0); // Is normal skeleton
break;
}
case mtVillager:
{
auto & Villager = static_cast<const cVillager &>(a_Mob);
@ -3857,6 +3884,7 @@ void cProtocol_1_8_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_M
break;
} // case mtWolf
case mtHusk:
case mtZombie:
{
auto & Zombie = static_cast<const cZombie &>(a_Mob);
@ -3889,7 +3917,46 @@ void cProtocol_1_8_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_M
break;
} // case mtZombieVillager
default: break;
case mtBlaze:
case mtElderGuardian:
case mtGuardian:
{
// TODO: Mobs with extra fields that aren't implemented
break;
}
case mtCat:
case mtEndermite:
case mtDonkey:
case mtMule:
case mtSkeletonHorse:
case mtZombieHorse:
{
// Todo: Mobs not added yet. Grouped ones have the same metadata
UNREACHABLE("cProtocol_1_8::WriteMobMetadata: received unimplemented type");
break;
}
case mtCaveSpider:
case mtEnderDragon:
case mtGiant:
case mtIronGolem:
case mtMooshroom:
case mtSilverfish:
case mtSnowGolem:
case mtSpider:
case mtSquid:
{
// Allowed mobs without additional metadata
break;
}
case mtInvalidType:
{
break;
}
default: UNREACHABLE("cProtocol_1_8::WriteMobMetadata: received mob of invalid type");
} // switch (a_Mob.GetType())
}

View File

@ -418,12 +418,20 @@ void cProtocol_1_9_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.WriteBEUInt8(static_cast<Byte>(GetProtocolMobType(a_Mob.GetMobType())));
Pkt.WriteBEUInt8(static_cast<Byte>(MobType));
Vector3d LastSentPos = a_Mob.GetLastSentPosition();
Pkt.WriteBEDouble(LastSentPos.x);
Pkt.WriteBEDouble(LastSentPos.y);
@ -572,6 +580,19 @@ cProtocol::Version cProtocol_1_9_0::GetProtocolVersion()
UInt32 cProtocol_1_9_0::GetProtocolMobType(const eMonsterType a_MobType)
{
switch (a_MobType)
{
case mtShulker: return 69;
default: return Super::GetProtocolMobType(a_MobType);
}
}
bool cProtocol_1_9_0::HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType)
{
switch (m_State)
@ -1756,7 +1777,7 @@ void cProtocol_1_9_0::WriteEntityMetadata(cPacketizer & a_Pkt, const cEntity & a
void cProtocol_1_9_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_Mob)
{
// 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?
@ -1966,6 +1987,13 @@ void cProtocol_1_9_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_M
break;
} // case mtSheep
case mtSkeleton:
{
a_Pkt.WriteBEUInt8(11);
a_Pkt.WriteBEUInt8(METADATA_TYPE_VARINT);
a_Pkt.WriteVarInt32(0);
}
case mtSlime:
{
auto & Slime = static_cast<const cSlime &>(a_Mob);
@ -2097,7 +2125,52 @@ void cProtocol_1_9_0::WriteMobMetadata(cPacketizer & a_Pkt, const cMonster & a_M
break;
} // case mtZombieVillager
default: break;
case mtBlaze:
case mtElderGuardian:
case mtGuardian:
{
// TODO: Mobs with extra fields that aren't implemented
break;
}
case mtCat:
case mtDonkey:
case mtEndermite:
case mtMule:
case mtStray:
case mtSkeletonHorse:
case mtZombieHorse:
case mtShulker:
{
// Todo: Mobs not added yet. Grouped ones have the same metadata
UNREACHABLE("cProtocol_1_9::WriteMobMetadata: received unimplemented type");
break;
}
case mtCaveSpider:
case mtEnderDragon:
case mtGiant:
case mtIronGolem:
case mtMooshroom:
case mtSilverfish:
case mtSnowGolem:
case mtSpider:
case mtSquid:
{
// Entities without additional metadata
break;
}
case mtInvalidType:
{
}
default: UNREACHABLE("cProtocol_1_9::WriteMobMetadata: received mob of invalid type");
} // switch (a_Mob.GetType())
}

View File

@ -72,6 +72,9 @@ protected:
/** Returns 1.9. */
virtual Version GetProtocolVersion() override;
/** Converts eMonsterType to protocol-specific mob types */
virtual UInt32 GetProtocolMobType(eMonsterType a_MobType) override;
/** Reads and handles the packet. The packet length and type have already been read.
Returns true if the packet was understood, false if it was an unknown packet. */
virtual bool HandlePacket(cByteBuffer & a_ByteBuffer, UInt32 a_PacketType) override;

View File

@ -5,6 +5,7 @@
#include "Globals.h"
#include "NBTChunkSerializer.h"
#include "EnchantmentSerializer.h"
#include "NamespaceSerializer.h"
#include "../ChunkDataCallback.h"
#include "../ItemGrid.h"
#include "../StringCompression.h"
@ -546,7 +547,7 @@ public:
{
mWriter.BeginCompound("");
AddBasicTileEntity(a_MobSpawner, "MobSpawner");
mWriter.AddString("EntityId", cMonster::MobTypeToVanillaName(a_MobSpawner->GetEntity()));
mWriter.AddString("EntityId", NamespaceSerializer::From(a_MobSpawner->GetEntity()));
mWriter.AddShort("SpawnCount", a_MobSpawner->GetSpawnCount());
mWriter.AddShort("SpawnRange", a_MobSpawner->GetSpawnRange());
mWriter.AddShort("Delay", a_MobSpawner->GetSpawnDelay());
@ -643,7 +644,7 @@ public:
void AddBasicEntity(cEntity * a_Entity, const AString & a_ClassName)
void AddBasicEntity(cEntity * a_Entity, const std::string_view a_ClassName)
{
mWriter.AddString("id", a_ClassName);
mWriter.BeginList("Pos", TAG_Double);
@ -762,51 +763,8 @@ public:
void AddMonsterEntity(cMonster * a_Monster)
{
const char * EntityClass = nullptr;
switch (a_Monster->GetMobType())
{
case mtBat: EntityClass = "Bat"; break;
case mtBlaze: EntityClass = "Blaze"; break;
case mtCaveSpider: EntityClass = "CaveSpider"; break;
case mtChicken: EntityClass = "Chicken"; break;
case mtCow: EntityClass = "Cow"; break;
case mtCreeper: EntityClass = "Creeper"; break;
case mtEnderDragon: EntityClass = "EnderDragon"; break;
case mtEnderman: EntityClass = "Enderman"; break;
case mtGhast: EntityClass = "Ghast"; break;
case mtGiant: EntityClass = "Giant"; break;
case mtGuardian: EntityClass = "Guardian"; break;
case mtHorse: EntityClass = "Horse"; break;
case mtIronGolem: EntityClass = "VillagerGolem"; break;
case mtMagmaCube: EntityClass = "LavaSlime"; break;
case mtMooshroom: EntityClass = "MushroomCow"; break;
case mtOcelot: EntityClass = "Ozelot"; break;
case mtPig: EntityClass = "Pig"; break;
case mtRabbit: EntityClass = "Rabbit"; break;
case mtSheep: EntityClass = "Sheep"; break;
case mtSilverfish: EntityClass = "Silverfish"; break;
case mtSkeleton: EntityClass = "Skeleton"; break;
case mtSlime: EntityClass = "Slime"; break;
case mtSnowGolem: EntityClass = "SnowMan"; break;
case mtSpider: EntityClass = "Spider"; break;
case mtSquid: EntityClass = "Squid"; break;
case mtVillager: EntityClass = "Villager"; break;
case mtWitch: EntityClass = "Witch"; break;
case mtWither: EntityClass = "WitherBoss"; break;
case mtWitherSkeleton: EntityClass = "WitherSkeleton"; break;
case mtWolf: EntityClass = "Wolf"; break;
case mtZombie: EntityClass = "Zombie"; break;
case mtZombiePigman: EntityClass = "PigZombie"; break;
case mtZombieVillager: EntityClass = "ZombieVillager"; break;
default:
{
ASSERT(!"Unhandled monster type");
return;
}
} // switch (payload)
mWriter.BeginCompound("");
AddBasicEntity(a_Monster, EntityClass);
AddBasicEntity(a_Monster, NamespaceSerializer::From(a_Monster->GetMobType()));
mWriter.BeginList("DropChances", TAG_Float);
mWriter.AddFloat("", a_Monster->GetDropChanceWeapon());
mWriter.AddFloat("", a_Monster->GetDropChanceHelmet());
@ -971,6 +929,7 @@ public:
mWriter.AddInt("Profession", ZombieVillager->GetProfession());
mWriter.AddInt("ConversionTime", ZombieVillager->ConversionTime());
mWriter.AddInt("Age", ZombieVillager->GetAge());
break;
}
case mtBlaze:
case mtCaveSpider:
@ -993,6 +952,47 @@ public:
// Other mobs have no special tags.
break;
}
case mtCat:
case mtCod:
case mtDolphin:
case mtDonkey:
case mtDrowned:
case mtElderGuardian:
case mtEndermite:
case mtEvoker:
case mtFox:
case mtHoglin:
case mtHusk:
case mtIllusioner:
case mtLlama:
case mtMule:
case mtPanda:
case mtParrot:
case mtPhantom:
case mtPiglin:
case mtPiglinBrute:
case mtPillager:
case mtPolarBear:
case mtPufferfish:
case mtRavager:
case mtSalmon:
case mtShulker:
case mtSkeletonHorse:
case mtStray:
case mtStrider:
case mtTraderLlama:
case mtTropicalFish:
case mtTurtle:
case mtVex:
case mtVindicator:
case mtWanderingTrader:
case mtZoglin:
case mtZombieHorse:
{
// All the entities not added
LOGD("Saving unimplemented entity type: %d", NamespaceSerializer::From(a_Monster->GetMobType()));
break;
}
case mtInvalidType:
{
ASSERT(!"NBTChunkSerializer::SerializerCollector::AddMonsterEntity: Recieved mob of invalid type");

View File

@ -2,284 +2,496 @@
#include "NamespaceSerializer.h"
namespace NamespaceSerializer
unsigned NamespaceSerializer::DataVersion()
{
unsigned DataVersion()
{
return 2566;
}
const char * From(const Statistic ID)
{
switch (ID)
{
case Statistic::AnimalsBred: return "animals_bred";
case Statistic::AviateOneCm: return "aviate_one_cm";
case Statistic::BellRing: return "bell_ring";
case Statistic::BoatOneCm: return "boat_one_cm";
case Statistic::CleanArmor: return "clean_armor";
case Statistic::CleanBanner: return "clean_banner";
case Statistic::CleanShulkerBox: return "clean_shulker_box";
case Statistic::ClimbOneCm: return "climb_one_cm";
case Statistic::CrouchOneCm: return "crouch_one_cm";
case Statistic::DamageAbsorbed: return "damage_absorbed";
case Statistic::DamageBlockedByShield: return "damage_blocked_by_shield";
case Statistic::DamageDealt: return "damage_dealt";
case Statistic::DamageDealtAbsorbed: return "damage_dealt_absorbed";
case Statistic::DamageDealtResisted: return "damage_dealt_resisted";
case Statistic::DamageResisted: return "damage_resisted";
case Statistic::DamageTaken: return "damage_taken";
case Statistic::Deaths: return "deaths";
case Statistic::Drop: return "drop";
case Statistic::EatCakeSlice: return "eat_cake_slice";
case Statistic::EnchantItem: return "enchant_item";
case Statistic::FallOneCm: return "fall_one_cm";
case Statistic::FillCauldron: return "fill_cauldron";
case Statistic::FishCaught: return "fish_caught";
case Statistic::FlyOneCm: return "fly_one_cm";
case Statistic::HorseOneCm: return "horse_one_cm";
case Statistic::InspectDispenser: return "inspect_dispenser";
case Statistic::InspectDropper: return "inspect_dropper";
case Statistic::InspectHopper: return "inspect_hopper";
case Statistic::InteractWithAnvil: return "interact_with_anvil";
case Statistic::InteractWithBeacon: return "interact_with_beacon";
case Statistic::InteractWithBlastFurnace: return "interact_with_blast_furnace";
case Statistic::InteractWithBrewingstand: return "interact_with_brewingstand";
case Statistic::InteractWithCampfire: return "interact_with_campfire";
case Statistic::InteractWithCartographyTable: return "interact_with_cartography_table";
case Statistic::InteractWithCraftingTable: return "interact_with_crafting_table";
case Statistic::InteractWithFurnace: return "interact_with_furnace";
case Statistic::InteractWithGrindstone: return "interact_with_grindstone";
case Statistic::InteractWithLectern: return "interact_with_lectern";
case Statistic::InteractWithLoom: return "interact_with_loom";
case Statistic::InteractWithSmithingTable: return "interact_with_smithing_table";
case Statistic::InteractWithSmoker: return "interact_with_smoker";
case Statistic::InteractWithStonecutter: return "interact_with_stonecutter";
case Statistic::Jump: return "jump";
case Statistic::LeaveGame: return "leave_game";
case Statistic::MinecartOneCm: return "minecart_one_cm";
case Statistic::MobKills: return "mob_kills";
case Statistic::OpenBarrel: return "open_barrel";
case Statistic::OpenChest: return "open_chest";
case Statistic::OpenEnderchest: return "open_enderchest";
case Statistic::OpenShulkerBox: return "open_shulker_box";
case Statistic::PigOneCm: return "pig_one_cm";
case Statistic::PlayNoteblock: return "play_noteblock";
case Statistic::PlayOneMinute: return "play_one_minute";
case Statistic::PlayRecord: return "play_record";
case Statistic::PlayerKills: return "player_kills";
case Statistic::PotFlower: return "pot_flower";
case Statistic::RaidTrigger: return "raid_trigger";
case Statistic::RaidWin: return "raid_win";
case Statistic::SleepInBed: return "sleep_in_bed";
case Statistic::SneakTime: return "sneak_time";
case Statistic::SprintOneCm: return "sprint_one_cm";
case Statistic::StriderOneCm: return "strider_one_cm";
case Statistic::SwimOneCm: return "swim_one_cm";
case Statistic::TalkedToVillager: return "talked_to_villager";
case Statistic::TargetHit: return "target_hit";
case Statistic::TimeSinceDeath: return "time_since_death";
case Statistic::TimeSinceRest: return "time_since_rest";
case Statistic::TradedWithVillager: return "traded_with_villager";
case Statistic::TriggerTrappedChest: return "trigger_trapped_chest";
case Statistic::TuneNoteblock: return "tune_noteblock";
case Statistic::UseCauldron: return "use_cauldron";
case Statistic::WalkOnWaterOneCm: return "walk_on_water_one_cm";
case Statistic::WalkOneCm: return "walk_one_cm";
case Statistic::WalkUnderWaterOneCm: return "walk_under_water_one_cm";
// Old ones just for compatibility
case Statistic::JunkFished: return "junk_fished";
case Statistic::TreasureFished: return "treasure_fished";
// The old advancements
case Statistic::AchOpenInventory: return "cuberite:achievement.openInventory";
case Statistic::AchMineWood: return "cuberite:achievement.mineWood";
case Statistic::AchBuildWorkBench: return "cuberite:achievement.buildWorkBench";
case Statistic::AchBuildPickaxe: return "cuberite:achievement.buildPickaxe";
case Statistic::AchBuildFurnace: return "cuberite:achievement.buildFurnace";
case Statistic::AchAcquireIron: return "cuberite:achievement.acquireIron";
case Statistic::AchBuildHoe: return "cuberite:achievement.buildHoe";
case Statistic::AchMakeBread: return "cuberite:achievement.makeBread";
case Statistic::AchBakeCake: return "cuberite:achievement.bakeCake";
case Statistic::AchBuildBetterPickaxe: return "cuberite:achievement.buildBetterPickaxe";
case Statistic::AchCookFish: return "cuberite:achievement.cookFish";
case Statistic::AchOnARail: return "cuberite:achievement.onARail";
case Statistic::AchBuildSword: return "cuberite:achievement.buildSword";
case Statistic::AchKillEnemy: return "cuberite:achievement.killEnemy";
case Statistic::AchKillCow: return "cuberite:achievement.killCow";
case Statistic::AchFlyPig: return "cuberite:achievement.flyPig";
case Statistic::AchSnipeSkeleton: return "cuberite:achievement.snipeSkeleton";
case Statistic::AchDiamonds: return "cuberite:achievement.diamonds";
case Statistic::AchPortal: return "cuberite:achievement.portal";
case Statistic::AchGhast: return "cuberite:achievement.ghast";
case Statistic::AchBlazeRod: return "cuberite:achievement.blazeRod";
case Statistic::AchPotion: return "cuberite:achievement.potion";
case Statistic::AchTheEnd: return "cuberite:achievement.theEnd";
case Statistic::AchTheEnd2: return "cuberite:achievement.theEnd2";
case Statistic::AchEnchantments: return "cuberite:achievement.enchantments";
case Statistic::AchOverkill: return "cuberite:achievement.overkill";
case Statistic::AchBookcase: return "cuberite:achievement.bookcase";
case Statistic::AchExploreAllBiomes: return "cuberite:achievement.exploreAllBiomes";
case Statistic::AchSpawnWither: return "cuberite:achievement.spawnWither";
case Statistic::AchKillWither: return "cuberite:achievement.killWither";
case Statistic::AchFullBeacon: return "cuberite:achievement.fullBeacon";
case Statistic::AchBreedCow: return "cuberite:achievement.breedCow";
case Statistic::AchDiamondsToYou: return "cuberite:achievement.diamondsToYou";
}
UNREACHABLE("Tried to save unhandled statistic");
}
Statistic ToCustomStatistic(const std::string_view ID)
{
static const std::unordered_map<std::string_view, Statistic> CustomStatistics
{
{ "animals_bred", Statistic::AnimalsBred },
{ "aviate_one_cm", Statistic::AviateOneCm },
{ "bell_ring", Statistic::BellRing },
{ "boat_one_cm", Statistic::BoatOneCm },
{ "clean_armor", Statistic::CleanArmor },
{ "clean_banner", Statistic::CleanBanner },
{ "clean_shulker_box", Statistic::CleanShulkerBox },
{ "climb_one_cm", Statistic::ClimbOneCm },
{ "crouch_one_cm", Statistic::CrouchOneCm },
{ "damage_absorbed", Statistic::DamageAbsorbed },
{ "damage_blocked_by_shield", Statistic::DamageBlockedByShield },
{ "damage_dealt", Statistic::DamageDealt },
{ "damage_dealt_absorbed", Statistic::DamageDealtAbsorbed },
{ "damage_dealt_resisted", Statistic::DamageDealtResisted },
{ "damage_resisted", Statistic::DamageResisted },
{ "damage_taken", Statistic::DamageTaken },
{ "deaths", Statistic::Deaths },
{ "drop", Statistic::Drop },
{ "eat_cake_slice", Statistic::EatCakeSlice },
{ "enchant_item", Statistic::EnchantItem },
{ "fall_one_cm", Statistic::FallOneCm },
{ "fill_cauldron", Statistic::FillCauldron },
{ "fish_caught", Statistic::FishCaught },
{ "fly_one_cm", Statistic::FlyOneCm },
{ "horse_one_cm", Statistic::HorseOneCm },
{ "inspect_dispenser", Statistic::InspectDispenser },
{ "inspect_dropper", Statistic::InspectDropper },
{ "inspect_hopper", Statistic::InspectHopper },
{ "interact_with_anvil", Statistic::InteractWithAnvil },
{ "interact_with_beacon", Statistic::InteractWithBeacon },
{ "interact_with_blast_furnace", Statistic::InteractWithBlastFurnace },
{ "interact_with_brewingstand", Statistic::InteractWithBrewingstand },
{ "interact_with_campfire", Statistic::InteractWithCampfire },
{ "interact_with_cartography_table", Statistic::InteractWithCartographyTable },
{ "interact_with_crafting_table", Statistic::InteractWithCraftingTable },
{ "interact_with_furnace", Statistic::InteractWithFurnace },
{ "interact_with_grindstone", Statistic::InteractWithGrindstone },
{ "interact_with_lectern", Statistic::InteractWithLectern },
{ "interact_with_loom", Statistic::InteractWithLoom },
{ "interact_with_smithing_table", Statistic::InteractWithSmithingTable },
{ "interact_with_smoker", Statistic::InteractWithSmoker },
{ "interact_with_stonecutter", Statistic::InteractWithStonecutter },
{ "jump", Statistic::Jump },
{ "leave_game", Statistic::LeaveGame },
{ "minecart_one_cm", Statistic::MinecartOneCm },
{ "mob_kills", Statistic::MobKills },
{ "open_barrel", Statistic::OpenBarrel },
{ "open_chest", Statistic::OpenChest },
{ "open_enderchest", Statistic::OpenEnderchest },
{ "open_shulker_box", Statistic::OpenShulkerBox },
{ "pig_one_cm", Statistic::PigOneCm },
{ "play_noteblock", Statistic::PlayNoteblock },
{ "play_one_minute", Statistic::PlayOneMinute },
{ "play_record", Statistic::PlayRecord },
{ "player_kills", Statistic::PlayerKills },
{ "pot_flower", Statistic::PotFlower },
{ "raid_trigger", Statistic::RaidTrigger },
{ "raid_win", Statistic::RaidWin },
{ "sleep_in_bed", Statistic::SleepInBed },
{ "sneak_time", Statistic::SneakTime },
{ "sprint_one_cm", Statistic::SprintOneCm },
{ "strider_one_cm", Statistic::StriderOneCm },
{ "swim_one_cm", Statistic::SwimOneCm },
{ "talked_to_villager", Statistic::TalkedToVillager },
{ "target_hit", Statistic::TargetHit },
{ "time_since_death", Statistic::TimeSinceDeath },
{ "time_since_rest", Statistic::TimeSinceRest },
{ "traded_with_villager", Statistic::TradedWithVillager },
{ "trigger_trapped_chest", Statistic::TriggerTrappedChest },
{ "tune_noteblock", Statistic::TuneNoteblock },
{ "use_cauldron", Statistic::UseCauldron },
{ "walk_on_water_one_cm", Statistic::WalkOnWaterOneCm },
{ "walk_one_cm", Statistic::WalkOneCm },
{ "walk_under_water_one_cm", Statistic::WalkUnderWaterOneCm },
// Old ones just for compatibility
{ "junk_fished", Statistic::JunkFished },
{ "treasure_fished", Statistic::TreasureFished },
// The old advancements
{ "cuberite:achievement.openInventory", Statistic::AchOpenInventory },
{ "cuberite:achievement.mineWood", Statistic::AchMineWood },
{ "cuberite:achievement.buildWorkBench", Statistic::AchBuildWorkBench },
{ "cuberite:achievement.buildPickaxe", Statistic::AchBuildPickaxe },
{ "cuberite:achievement.buildFurnace", Statistic::AchBuildFurnace },
{ "cuberite:achievement.acquireIron", Statistic::AchAcquireIron },
{ "cuberite:achievement.buildHoe", Statistic::AchBuildHoe },
{ "cuberite:achievement.makeBread", Statistic::AchMakeBread },
{ "cuberite:achievement.bakeCake", Statistic::AchBakeCake },
{ "cuberite:achievement.buildBetterPickaxe", Statistic::AchBuildBetterPickaxe },
{ "cuberite:achievement.cookFish", Statistic::AchCookFish },
{ "cuberite:achievement.onARail", Statistic::AchOnARail },
{ "cuberite:achievement.buildSword", Statistic::AchBuildSword },
{ "cuberite:achievement.killEnemy", Statistic::AchKillEnemy },
{ "cuberite:achievement.killCow", Statistic::AchKillCow },
{ "cuberite:achievement.flyPig", Statistic::AchFlyPig },
{ "cuberite:achievement.snipeSkeleton", Statistic::AchSnipeSkeleton },
{ "cuberite:achievement.diamonds", Statistic::AchDiamonds },
{ "cuberite:achievement.portal", Statistic::AchPortal },
{ "cuberite:achievement.ghast", Statistic::AchGhast },
{ "cuberite:achievement.blazeRod", Statistic::AchBlazeRod },
{ "cuberite:achievement.potion", Statistic::AchPotion },
{ "cuberite:achievement.theEnd", Statistic::AchTheEnd },
{ "cuberite:achievement.theEnd2", Statistic::AchTheEnd2 },
{ "cuberite:achievement.enchantments", Statistic::AchEnchantments },
{ "cuberite:achievement.overkill", Statistic::AchOverkill },
{ "cuberite:achievement.bookcase", Statistic::AchBookcase },
{ "cuberite:achievement.exploreAllBiomes", Statistic::AchExploreAllBiomes },
{ "cuberite:achievement.spawnWither", Statistic::AchSpawnWither },
{ "cuberite:achievement.killWither", Statistic::AchKillWither },
{ "cuberite:achievement.fullBeacon", Statistic::AchFullBeacon },
{ "cuberite:achievement.breedCow", Statistic::AchBreedCow },
{ "cuberite:achievement.diamondsToYou", Statistic::AchDiamondsToYou}
};
return CustomStatistics.at(ID);
}
std::pair<Namespace, std::string_view> SplitNamespacedID(const std::string_view ID)
{
const auto NamespaceIndex = ID.find(':');
if (NamespaceIndex == std::string_view::npos)
{
// No explicit namespace defaults to the Minecraft namespace:
return { Namespace::Minecraft, ID };
}
const auto Namespace = ID.substr(0, NamespaceIndex);
if (Namespace == "minecraft")
{
// An unprefixed ID in the vanilla Minecraft namespace.
const auto Value = ID.substr(NamespaceIndex + 1);
return { Namespace::Minecraft, Value };
}
if (Namespace == "cuberite")
{
return { Namespace::Cuberite, ID };
}
return { Namespace::Unknown, ID };
}
return 2566;
}
std::string_view NamespaceSerializer::From(const Statistic a_ID)
{
switch (a_ID)
{
case Statistic::AnimalsBred: return "animals_bred";
case Statistic::AviateOneCm: return "aviate_one_cm";
case Statistic::BellRing: return "bell_ring";
case Statistic::BoatOneCm: return "boat_one_cm";
case Statistic::CleanArmor: return "clean_armor";
case Statistic::CleanBanner: return "clean_banner";
case Statistic::CleanShulkerBox: return "clean_shulker_box";
case Statistic::ClimbOneCm: return "climb_one_cm";
case Statistic::CrouchOneCm: return "crouch_one_cm";
case Statistic::DamageAbsorbed: return "damage_absorbed";
case Statistic::DamageBlockedByShield: return "damage_blocked_by_shield";
case Statistic::DamageDealt: return "damage_dealt";
case Statistic::DamageDealtAbsorbed: return "damage_dealt_absorbed";
case Statistic::DamageDealtResisted: return "damage_dealt_resisted";
case Statistic::DamageResisted: return "damage_resisted";
case Statistic::DamageTaken: return "damage_taken";
case Statistic::Deaths: return "deaths";
case Statistic::Drop: return "drop";
case Statistic::EatCakeSlice: return "eat_cake_slice";
case Statistic::EnchantItem: return "enchant_item";
case Statistic::FallOneCm: return "fall_one_cm";
case Statistic::FillCauldron: return "fill_cauldron";
case Statistic::FishCaught: return "fish_caught";
case Statistic::FlyOneCm: return "fly_one_cm";
case Statistic::HorseOneCm: return "horse_one_cm";
case Statistic::InspectDispenser: return "inspect_dispenser";
case Statistic::InspectDropper: return "inspect_dropper";
case Statistic::InspectHopper: return "inspect_hopper";
case Statistic::InteractWithAnvil: return "interact_with_anvil";
case Statistic::InteractWithBeacon: return "interact_with_beacon";
case Statistic::InteractWithBlastFurnace: return "interact_with_blast_furnace";
case Statistic::InteractWithBrewingstand: return "interact_with_brewingstand";
case Statistic::InteractWithCampfire: return "interact_with_campfire";
case Statistic::InteractWithCartographyTable: return "interact_with_cartography_table";
case Statistic::InteractWithCraftingTable: return "interact_with_crafting_table";
case Statistic::InteractWithFurnace: return "interact_with_furnace";
case Statistic::InteractWithGrindstone: return "interact_with_grindstone";
case Statistic::InteractWithLectern: return "interact_with_lectern";
case Statistic::InteractWithLoom: return "interact_with_loom";
case Statistic::InteractWithSmithingTable: return "interact_with_smithing_table";
case Statistic::InteractWithSmoker: return "interact_with_smoker";
case Statistic::InteractWithStonecutter: return "interact_with_stonecutter";
case Statistic::Jump: return "jump";
case Statistic::LeaveGame: return "leave_game";
case Statistic::MinecartOneCm: return "minecart_one_cm";
case Statistic::MobKills: return "mob_kills";
case Statistic::OpenBarrel: return "open_barrel";
case Statistic::OpenChest: return "open_chest";
case Statistic::OpenEnderchest: return "open_enderchest";
case Statistic::OpenShulkerBox: return "open_shulker_box";
case Statistic::PigOneCm: return "pig_one_cm";
case Statistic::PlayNoteblock: return "play_noteblock";
case Statistic::PlayOneMinute: return "play_one_minute";
case Statistic::PlayRecord: return "play_record";
case Statistic::PlayerKills: return "player_kills";
case Statistic::PotFlower: return "pot_flower";
case Statistic::RaidTrigger: return "raid_trigger";
case Statistic::RaidWin: return "raid_win";
case Statistic::SleepInBed: return "sleep_in_bed";
case Statistic::SneakTime: return "sneak_time";
case Statistic::SprintOneCm: return "sprint_one_cm";
case Statistic::StriderOneCm: return "strider_one_cm";
case Statistic::SwimOneCm: return "swim_one_cm";
case Statistic::TalkedToVillager: return "talked_to_villager";
case Statistic::TargetHit: return "target_hit";
case Statistic::TimeSinceDeath: return "time_since_death";
case Statistic::TimeSinceRest: return "time_since_rest";
case Statistic::TradedWithVillager: return "traded_with_villager";
case Statistic::TriggerTrappedChest: return "trigger_trapped_chest";
case Statistic::TuneNoteblock: return "tune_noteblock";
case Statistic::UseCauldron: return "use_cauldron";
case Statistic::WalkOnWaterOneCm: return "walk_on_water_one_cm";
case Statistic::WalkOneCm: return "walk_one_cm";
case Statistic::WalkUnderWaterOneCm: return "walk_under_water_one_cm";
// Old ones just for compatibility
case Statistic::JunkFished: return "junk_fished";
case Statistic::TreasureFished: return "treasure_fished";
// The old advancements
case Statistic::AchOpenInventory: return "cuberite:achievement.openInventory";
case Statistic::AchMineWood: return "cuberite:achievement.mineWood";
case Statistic::AchBuildWorkBench: return "cuberite:achievement.buildWorkBench";
case Statistic::AchBuildPickaxe: return "cuberite:achievement.buildPickaxe";
case Statistic::AchBuildFurnace: return "cuberite:achievement.buildFurnace";
case Statistic::AchAcquireIron: return "cuberite:achievement.acquireIron";
case Statistic::AchBuildHoe: return "cuberite:achievement.buildHoe";
case Statistic::AchMakeBread: return "cuberite:achievement.makeBread";
case Statistic::AchBakeCake: return "cuberite:achievement.bakeCake";
case Statistic::AchBuildBetterPickaxe: return "cuberite:achievement.buildBetterPickaxe";
case Statistic::AchCookFish: return "cuberite:achievement.cookFish";
case Statistic::AchOnARail: return "cuberite:achievement.onARail";
case Statistic::AchBuildSword: return "cuberite:achievement.buildSword";
case Statistic::AchKillEnemy: return "cuberite:achievement.killEnemy";
case Statistic::AchKillCow: return "cuberite:achievement.killCow";
case Statistic::AchFlyPig: return "cuberite:achievement.flyPig";
case Statistic::AchSnipeSkeleton: return "cuberite:achievement.snipeSkeleton";
case Statistic::AchDiamonds: return "cuberite:achievement.diamonds";
case Statistic::AchPortal: return "cuberite:achievement.portal";
case Statistic::AchGhast: return "cuberite:achievement.ghast";
case Statistic::AchBlazeRod: return "cuberite:achievement.blazeRod";
case Statistic::AchPotion: return "cuberite:achievement.potion";
case Statistic::AchTheEnd: return "cuberite:achievement.theEnd";
case Statistic::AchTheEnd2: return "cuberite:achievement.theEnd2";
case Statistic::AchEnchantments: return "cuberite:achievement.enchantments";
case Statistic::AchOverkill: return "cuberite:achievement.overkill";
case Statistic::AchBookcase: return "cuberite:achievement.bookcase";
case Statistic::AchExploreAllBiomes: return "cuberite:achievement.exploreAllBiomes";
case Statistic::AchSpawnWither: return "cuberite:achievement.spawnWither";
case Statistic::AchKillWither: return "cuberite:achievement.killWither";
case Statistic::AchFullBeacon: return "cuberite:achievement.fullBeacon";
case Statistic::AchBreedCow: return "cuberite:achievement.breedCow";
case Statistic::AchDiamondsToYou: return "cuberite:achievement.diamondsToYou";
}
UNREACHABLE("Tried to save unhandled statistic");
}
std::string_view NamespaceSerializer::From(eMonsterType a_ID)
{
switch (a_ID)
{
case mtBat: return "bat";
case mtBlaze: return "blaze";
case mtCat: return "cat";
case mtCaveSpider: return "cave_spider";
case mtChicken: return "chicken";
case mtCod: return "cod";
case mtCow: return "cow";
case mtCreeper: return "creeper";
case mtDolphin: return "dolphin";
case mtDonkey: return "donkey";
case mtDrowned: return "drowned";
case mtElderGuardian: return "elder_guardian";
case mtEnderDragon: return "ender_dragon";
case mtEnderman: return "enderman";
case mtEndermite: return "endermite";
case mtEvoker: return "evoker";
case mtFox: return "fox";
case mtGhast: return "ghast";
case mtGiant: return "giant";
case mtGuardian: return "guardian";
case mtHorse: return "horse";
case mtHoglin: return "hoglin";
case mtHusk: return "husk";
case mtIllusioner: return "illusioner";
case mtIronGolem: return "iron_golem";
case mtLlama: return "llama";
case mtMagmaCube: return "magma_cube";
case mtMooshroom: return "mooshroom";
case mtMule: return "mule";
case mtOcelot: return "ocelot";
case mtPanda: return "panda";
case mtParrot: return "parrot";
case mtPhantom: return "phantom";
case mtPig: return "pig";
case mtPiglin: return "piglin";
case mtPiglinBrute: return "piglin_brute";
case mtPillager: return "pillager";
case mtPolarBear: return "polar_bear";
case mtPufferfish: return "pufferfish";
case mtRabbit: return "rabbit";
case mtRavager: return "ravager";
case mtSalmon: return "salmon";
case mtSheep: return "sheep";
case mtShulker: return "shulker";
case mtSilverfish: return "silverfish";
case mtSkeleton: return "skeleton";
case mtSkeletonHorse: return "skeleton_horse";
case mtSlime: return "slime";
case mtSnowGolem: return "snow_golem";
case mtSpider: return "spider";
case mtSquid: return "squid";
case mtStray: return "stray";
case mtStrider: return "strider";
case mtTraderLlama: return "trader_llama";
case mtTropicalFish: return "tropical_fish";
case mtTurtle: return "turtle";
case mtVex: return "vex";
case mtVillager: return "villager";
case mtVindicator: return "vindicator";
case mtWanderingTrader:return "wandering_trader";
case mtWitch: return "witch";
case mtWither: return "wither";
case mtWitherSkeleton: return "wither_skeleton";
case mtWolf: return "wolf";
case mtZoglin: return "zoglin";
case mtZombie: return "zombie";
case mtZombieHorse: return "zombie_horse";
case mtZombiePigman: return "zombified_piglin";
case mtZombieVillager: return "zombie_villager";
case mtInvalidType: break;
}
UNREACHABLE("Tried to save unknown monster type");
}
Statistic NamespaceSerializer::ToCustomStatistic(const std::string_view ID)
{
static const std::unordered_map<std::string_view, Statistic> CustomStatistics
{
{ "animals_bred", Statistic::AnimalsBred },
{ "aviate_one_cm", Statistic::AviateOneCm },
{ "bell_ring", Statistic::BellRing },
{ "boat_one_cm", Statistic::BoatOneCm },
{ "clean_armor", Statistic::CleanArmor },
{ "clean_banner", Statistic::CleanBanner },
{ "clean_shulker_box", Statistic::CleanShulkerBox },
{ "climb_one_cm", Statistic::ClimbOneCm },
{ "crouch_one_cm", Statistic::CrouchOneCm },
{ "damage_absorbed", Statistic::DamageAbsorbed },
{ "damage_blocked_by_shield", Statistic::DamageBlockedByShield },
{ "damage_dealt", Statistic::DamageDealt },
{ "damage_dealt_absorbed", Statistic::DamageDealtAbsorbed },
{ "damage_dealt_resisted", Statistic::DamageDealtResisted },
{ "damage_resisted", Statistic::DamageResisted },
{ "damage_taken", Statistic::DamageTaken },
{ "deaths", Statistic::Deaths },
{ "drop", Statistic::Drop },
{ "eat_cake_slice", Statistic::EatCakeSlice },
{ "enchant_item", Statistic::EnchantItem },
{ "fall_one_cm", Statistic::FallOneCm },
{ "fill_cauldron", Statistic::FillCauldron },
{ "fish_caught", Statistic::FishCaught },
{ "fly_one_cm", Statistic::FlyOneCm },
{ "horse_one_cm", Statistic::HorseOneCm },
{ "inspect_dispenser", Statistic::InspectDispenser },
{ "inspect_dropper", Statistic::InspectDropper },
{ "inspect_hopper", Statistic::InspectHopper },
{ "interact_with_anvil", Statistic::InteractWithAnvil },
{ "interact_with_beacon", Statistic::InteractWithBeacon },
{ "interact_with_blast_furnace", Statistic::InteractWithBlastFurnace },
{ "interact_with_brewingstand", Statistic::InteractWithBrewingstand },
{ "interact_with_campfire", Statistic::InteractWithCampfire },
{ "interact_with_cartography_table", Statistic::InteractWithCartographyTable },
{ "interact_with_crafting_table", Statistic::InteractWithCraftingTable },
{ "interact_with_furnace", Statistic::InteractWithFurnace },
{ "interact_with_grindstone", Statistic::InteractWithGrindstone },
{ "interact_with_lectern", Statistic::InteractWithLectern },
{ "interact_with_loom", Statistic::InteractWithLoom },
{ "interact_with_smithing_table", Statistic::InteractWithSmithingTable },
{ "interact_with_smoker", Statistic::InteractWithSmoker },
{ "interact_with_stonecutter", Statistic::InteractWithStonecutter },
{ "jump", Statistic::Jump },
{ "leave_game", Statistic::LeaveGame },
{ "minecart_one_cm", Statistic::MinecartOneCm },
{ "mob_kills", Statistic::MobKills },
{ "open_barrel", Statistic::OpenBarrel },
{ "open_chest", Statistic::OpenChest },
{ "open_enderchest", Statistic::OpenEnderchest },
{ "open_shulker_box", Statistic::OpenShulkerBox },
{ "pig_one_cm", Statistic::PigOneCm },
{ "play_noteblock", Statistic::PlayNoteblock },
{ "play_one_minute", Statistic::PlayOneMinute },
{ "play_record", Statistic::PlayRecord },
{ "player_kills", Statistic::PlayerKills },
{ "pot_flower", Statistic::PotFlower },
{ "raid_trigger", Statistic::RaidTrigger },
{ "raid_win", Statistic::RaidWin },
{ "sleep_in_bed", Statistic::SleepInBed },
{ "sneak_time", Statistic::SneakTime },
{ "sprint_one_cm", Statistic::SprintOneCm },
{ "strider_one_cm", Statistic::StriderOneCm },
{ "swim_one_cm", Statistic::SwimOneCm },
{ "talked_to_villager", Statistic::TalkedToVillager },
{ "target_hit", Statistic::TargetHit },
{ "time_since_death", Statistic::TimeSinceDeath },
{ "time_since_rest", Statistic::TimeSinceRest },
{ "traded_with_villager", Statistic::TradedWithVillager },
{ "trigger_trapped_chest", Statistic::TriggerTrappedChest },
{ "tune_noteblock", Statistic::TuneNoteblock },
{ "use_cauldron", Statistic::UseCauldron },
{ "walk_on_water_one_cm", Statistic::WalkOnWaterOneCm },
{ "walk_one_cm", Statistic::WalkOneCm },
{ "walk_under_water_one_cm", Statistic::WalkUnderWaterOneCm },
// Old ones just for compatibility
{ "junk_fished", Statistic::JunkFished },
{ "treasure_fished", Statistic::TreasureFished },
// The old advancements
{ "cuberite:achievement.openInventory", Statistic::AchOpenInventory },
{ "cuberite:achievement.mineWood", Statistic::AchMineWood },
{ "cuberite:achievement.buildWorkBench", Statistic::AchBuildWorkBench },
{ "cuberite:achievement.buildPickaxe", Statistic::AchBuildPickaxe },
{ "cuberite:achievement.buildFurnace", Statistic::AchBuildFurnace },
{ "cuberite:achievement.acquireIron", Statistic::AchAcquireIron },
{ "cuberite:achievement.buildHoe", Statistic::AchBuildHoe },
{ "cuberite:achievement.makeBread", Statistic::AchMakeBread },
{ "cuberite:achievement.bakeCake", Statistic::AchBakeCake },
{ "cuberite:achievement.buildBetterPickaxe", Statistic::AchBuildBetterPickaxe },
{ "cuberite:achievement.cookFish", Statistic::AchCookFish },
{ "cuberite:achievement.onARail", Statistic::AchOnARail },
{ "cuberite:achievement.buildSword", Statistic::AchBuildSword },
{ "cuberite:achievement.killEnemy", Statistic::AchKillEnemy },
{ "cuberite:achievement.killCow", Statistic::AchKillCow },
{ "cuberite:achievement.flyPig", Statistic::AchFlyPig },
{ "cuberite:achievement.snipeSkeleton", Statistic::AchSnipeSkeleton },
{ "cuberite:achievement.diamonds", Statistic::AchDiamonds },
{ "cuberite:achievement.portal", Statistic::AchPortal },
{ "cuberite:achievement.ghast", Statistic::AchGhast },
{ "cuberite:achievement.blazeRod", Statistic::AchBlazeRod },
{ "cuberite:achievement.potion", Statistic::AchPotion },
{ "cuberite:achievement.theEnd", Statistic::AchTheEnd },
{ "cuberite:achievement.theEnd2", Statistic::AchTheEnd2 },
{ "cuberite:achievement.enchantments", Statistic::AchEnchantments },
{ "cuberite:achievement.overkill", Statistic::AchOverkill },
{ "cuberite:achievement.bookcase", Statistic::AchBookcase },
{ "cuberite:achievement.exploreAllBiomes", Statistic::AchExploreAllBiomes },
{ "cuberite:achievement.spawnWither", Statistic::AchSpawnWither },
{ "cuberite:achievement.killWither", Statistic::AchKillWither },
{ "cuberite:achievement.fullBeacon", Statistic::AchFullBeacon },
{ "cuberite:achievement.breedCow", Statistic::AchBreedCow },
{ "cuberite:achievement.diamondsToYou", Statistic::AchDiamondsToYou}
};
return CustomStatistics.at(ID);
}
std::pair<NamespaceSerializer::Namespace, std::string_view> NamespaceSerializer::SplitNamespacedID(const std::string_view ID)
{
const auto NamespaceIndex = ID.find(':');
if (NamespaceIndex == std::string_view::npos)
{
// No explicit namespace defaults to the Minecraft namespace:
return { Namespace::Minecraft, ID };
}
const auto Namespace = ID.substr(0, NamespaceIndex);
if (Namespace == "minecraft")
{
// An unprefixed ID in the vanilla Minecraft namespace.
const auto Value = ID.substr(NamespaceIndex + 1);
return { Namespace::Minecraft, Value };
}
if (Namespace == "cuberite")
{
return { Namespace::Cuberite, ID };
}
return { Namespace::Unknown, ID };
}
eMonsterType NamespaceSerializer::ToMonsterType(const std::string_view a_ID)
{
static const std::unordered_map<std::string_view, eMonsterType> MonsterTypes
{
{ "bat", mtBat },
{ "blaze", mtBlaze },
{ "cat", mtCat },
{ "cave_spider", mtCaveSpider },
{ "chicken", mtChicken },
{ "cod", mtCod },
{ "cow", mtCow },
{ "creeper", mtCreeper },
{ "dolphin", mtDolphin },
{ "donkey", mtDonkey },
{ "drowned", mtDrowned },
{ "elder_guardian", mtElderGuardian },
{ "ender_dragon", mtEnderDragon },
{ "enderman", mtEnderman },
{ "endermite", mtEndermite },
{ "evoker", mtEvoker },
{ "fox", mtFox },
{ "ghast", mtGhast },
{ "giant", mtGiant },
{ "guardian", mtGuardian },
{ "horse", mtHorse },
{ "hoglin", mtHoglin },
{ "husk", mtHusk },
{ "illusioner", mtIllusioner },
{ "iron_golem", mtIronGolem },
{ "llama", mtLlama },
{ "magma_cube", mtMagmaCube },
{ "mooshroom", mtMooshroom },
{ "mule", mtMule },
{ "ocelot", mtOcelot },
{ "panda", mtPanda },
{ "parrot", mtParrot },
{ "phantom", mtPhantom },
{ "pig", mtPig },
{ "piglin", mtPiglin },
{ "piglin_brute", mtPiglinBrute },
{ "pillager", mtPillager },
{ "polar_bear", mtPolarBear },
{ "pufferfish", mtPufferfish },
{ "rabbit", mtRabbit },
{ "ravager", mtRavager },
{ "salmon", mtSalmon },
{ "sheep", mtSheep },
{ "shulker", mtShulker },
{ "silverfish", mtSilverfish },
{ "skeleton", mtSkeleton },
{ "skeleton_horse", mtSkeletonHorse },
{ "slime", mtSlime },
{ "snow_golem", mtSnowGolem },
{ "spider", mtSpider },
{ "squid", mtSquid },
{ "stray", mtStray },
{ "strider", mtStrider },
{ "trader_llama", mtTraderLlama },
{ "tropical_fish", mtTropicalFish },
{ "turtle", mtTurtle },
{ "vex", mtVex },
{ "villager", mtVillager },
{ "vindicator", mtVindicator },
{ "wandering_trader", mtWanderingTrader },
{ "witch", mtWitch },
{ "wither", mtWither },
{ "wither_skeleton", mtWitherSkeleton },
{ "wolf", mtWolf },
{ "zoglin", mtZoglin },
{ "zombie", mtZombie },
{ "zombie_horse", mtZombieHorse },
{ "zombie_pigman", mtZombiePigman },
{ "zombie_villager", mtZombieVillager },
{ "villager_golem", mtIronGolem },
{ "snowman", mtSnowGolem },
// Old names:
{ "Bat", mtBat },
{ "Blaze", mtBlaze },
{ "CaveSpider", mtCaveSpider },
{ "Chicken", mtChicken },
{ "Cow", mtCow },
{ "Creeper", mtCreeper },
{ "EnderDragon", mtEnderDragon },
{ "Enderman", mtEnderman },
{ "Ghast", mtGhast },
{ "Giant", mtGiant },
{ "Guardian", mtGuardian },
{ "Horse", mtHorse },
{ "VillagerGolem", mtIronGolem },
{ "LavaSlime", mtMagmaCube },
{ "MushroomCow", mtMooshroom },
{ "Ozelot", mtOcelot },
{ "Pig", mtPig },
{ "Rabbit", mtRabbit },
{ "Sheep", mtSheep },
{ "Silverfish", mtSilverfish },
{ "Skeleton", mtSkeleton },
{ "Slime", mtSlime },
{ "SnowMan", mtSnowGolem },
{ "Spider", mtSpider },
{ "Squid", mtSquid },
{ "Villager", mtVillager },
{ "Witch", mtWitch },
{ "WitherBoss", mtWither },
{ "WitherSkeleton", mtWitherSkeleton },
{ "Wolf", mtWolf },
{ "Zombie", mtZombie },
{ "PigZombie", mtZombiePigman },
{ "ZombieVillager", mtZombieVillager }
};
return MonsterTypes.at(a_ID);
}

View File

@ -1,6 +1,7 @@
#pragma once
#include "../Registries/Statistics.h"
#include "../Mobs/MonsterTypes.h"
namespace NamespaceSerializer
{
@ -13,9 +14,11 @@ namespace NamespaceSerializer
unsigned DataVersion();
const char * From(Statistic ID);
std::string_view From(Statistic a_ID);
std::string_view From(eMonsterType a_ID);
Statistic ToCustomStatistic(std::string_view ID);
Statistic ToCustomStatistic(std::string_view a_ID);
eMonsterType ToMonsterType(std::string_view a_ID);
std::pair<Namespace, std::string_view> SplitNamespacedID(std::string_view ID);
}

View File

@ -46,7 +46,7 @@ namespace StatSerializer
auto & Custom = a_Out["custom"];
for (const auto & Item : Store)
{
Custom[NamespaceSerializer::From(Item.first)] = Item.second;
Custom[NamespaceSerializer::From(Item.first).data()] = Item.second;
}
});
}

View File

@ -7,6 +7,7 @@
#include "WSSAnvil.h"
#include "NBTChunkSerializer.h"
#include "EnchantmentSerializer.h"
#include "NamespaceSerializer.h"
#include "zlib/zlib.h"
#include "json/json.h"
#include "../World.h"
@ -583,7 +584,15 @@ void cWSSAnvil::LoadEntitiesFromNBT(cEntityList & a_Entities, const cParsedNBT &
{
continue;
}
LoadEntityFromNBT(a_Entities, a_NBT, Child, a_NBT.GetData(sID), a_NBT.GetDataLength(sID));
try
{
LoadEntityFromNBT(a_Entities, a_NBT, Child, a_NBT.GetData(sID), a_NBT.GetDataLength(sID));
}
catch (...)
{
continue;
}
} // for Child - a_NBT[]
}
@ -617,15 +626,28 @@ void cWSSAnvil::LoadBlockEntitiesFromNBT(cBlockEntities & a_BlockEntities, const
// Load the proper BlockEntity type based on the block type:
BLOCKTYPE BlockType = cChunkDef::GetBlock(a_BlockTypes, relPos);
NIBBLETYPE BlockMeta = cChunkDef::GetNibble(a_BlockMetas, relPos);
auto be = LoadBlockEntityFromNBT(a_NBT, Child, absPos, BlockType, BlockMeta);
if (be == nullptr)
OwnedBlockEntity Entity;
try
{
Entity = LoadBlockEntityFromNBT(a_NBT, Child, absPos, BlockType, BlockMeta);
}
catch (...)
{
continue;
}
// TODO: exception-ify the failure case
if (Entity == nullptr)
{
continue;
}
// Index computed before Entity moved.
const auto Idx = cChunkDef::MakeIndexNoCheck(Entity->GetRelPos());
// Add the BlockEntity to the loaded data:
auto Idx = cChunkDef::MakeIndex(be->GetRelX(), be->GetPosY(), be->GetRelZ());
a_BlockEntities.emplace(Idx, std::move(be));
a_BlockEntities.emplace(Idx, std::move(Entity));
} // for Child - tag children
}
@ -1342,7 +1364,13 @@ OwnedBlockEntity cWSSAnvil::LoadMobSpawnerFromNBT(const cParsedNBT & a_NBT, int
int Type = a_NBT.FindChildByName(a_TagIdx, "EntityId");
if ((Type >= 0) && (a_NBT.GetType(Type) == TAG_String))
{
eMonsterType MonsterType = cMonster::StringToMobType(a_NBT.GetString(Type));
const auto StatInfo = NamespaceSerializer::SplitNamespacedID(a_NBT.GetString(Type));
if (StatInfo.first == NamespaceSerializer::Namespace::Unknown)
{
return nullptr;
}
eMonsterType MonsterType = NamespaceSerializer::ToMonsterType(StatInfo.second);
if (MonsterType != eMonsterType::mtInvalidType)
{
MobSpawner->SetEntity(MonsterType);
@ -1591,81 +1619,97 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a
{ "SmallFireball", &cWSSAnvil::LoadFireChargeFromNBT },
{ "minecraft:small_fireball", &cWSSAnvil::LoadFireChargeFromNBT },
{ "ThrownEnderpearl", &cWSSAnvil::LoadThrownEnderpearlFromNBT },
{ "minecraft:ender_pearl", &cWSSAnvil::LoadThrownEnderpearlFromNBT },
{ "Bat", &cWSSAnvil::LoadBatFromNBT },
{ "minecraft:bat", &cWSSAnvil::LoadBatFromNBT },
{ "Blaze", &cWSSAnvil::LoadBlazeFromNBT },
{ "minecraft:blaze", &cWSSAnvil::LoadBlazeFromNBT },
{ "CaveSpider", &cWSSAnvil::LoadCaveSpiderFromNBT },
{ "minecraft:cave_spider", &cWSSAnvil::LoadCaveSpiderFromNBT },
{ "Chicken", &cWSSAnvil::LoadChickenFromNBT },
{ "minecraft:chicken", &cWSSAnvil::LoadChickenFromNBT },
{ "Cow", &cWSSAnvil::LoadCowFromNBT },
{ "minecraft:cow", &cWSSAnvil::LoadCowFromNBT },
{ "Creeper", &cWSSAnvil::LoadCreeperFromNBT },
{ "minecraft:creeper", &cWSSAnvil::LoadCreeperFromNBT },
{ "EnderDragon", &cWSSAnvil::LoadEnderDragonFromNBT },
{ "minecraft:ender_dragon", &cWSSAnvil::LoadEnderDragonFromNBT },
{ "Enderman", &cWSSAnvil::LoadEndermanFromNBT },
{ "minecraft:enderman", &cWSSAnvil::LoadEndermanFromNBT },
{ "Ghast", &cWSSAnvil::LoadGhastFromNBT },
{ "minecraft:ghast", &cWSSAnvil::LoadGhastFromNBT },
{ "Giant", &cWSSAnvil::LoadGiantFromNBT },
{ "minecraft:giant", &cWSSAnvil::LoadGiantFromNBT },
{ "Guardian", &cWSSAnvil::LoadGuardianFromNBT },
{ "minecraft:guardian", &cWSSAnvil::LoadGuardianFromNBT },
{ "Horse", &cWSSAnvil::LoadHorseFromNBT },
{ "minecraft:horse", &cWSSAnvil::LoadHorseFromNBT },
{ "Villager", &cWSSAnvil::LoadVillagerFromNBT },
{ "minecraft:villager", &cWSSAnvil::LoadVillagerFromNBT },
{ "VillagerGolem", &cWSSAnvil::LoadIronGolemFromNBT },
{ "minecraft:villager_golem", &cWSSAnvil::LoadIronGolemFromNBT },
{ "LavaSlime", &cWSSAnvil::LoadMagmaCubeFromNBT },
{ "minecraft:magma_cube", &cWSSAnvil::LoadMagmaCubeFromNBT },
{ "MushroomCow", &cWSSAnvil::LoadMooshroomFromNBT },
{ "minecraft:mooshroom", &cWSSAnvil::LoadMooshroomFromNBT },
{ "Ozelot", &cWSSAnvil::LoadOcelotFromNBT },
{ "minecraft:ocelot", &cWSSAnvil::LoadOcelotFromNBT },
{ "Pig", &cWSSAnvil::LoadPigFromNBT },
{ "minecraft:pig", &cWSSAnvil::LoadPigFromNBT },
{ "Rabbit", &cWSSAnvil::LoadRabbitFromNBT },
{ "minecraft:rabbit", &cWSSAnvil::LoadRabbitFromNBT },
{ "Sheep", &cWSSAnvil::LoadSheepFromNBT },
{ "minecraft:sheep", &cWSSAnvil::LoadSheepFromNBT },
{ "Silverfish", &cWSSAnvil::LoadSilverfishFromNBT },
{ "minecraft:silverfish", &cWSSAnvil::LoadSilverfishFromNBT },
{ "Skeleton", &cWSSAnvil::LoadSkeletonFromNBT },
{ "minecraft:skeleton", &cWSSAnvil::LoadSkeletonFromNBT },
{ "Slime", &cWSSAnvil::LoadSlimeFromNBT },
{ "minecraft:slime", &cWSSAnvil::LoadSlimeFromNBT },
{ "SnowMan", &cWSSAnvil::LoadSnowGolemFromNBT },
{ "minecraft:snowman", &cWSSAnvil::LoadSnowGolemFromNBT },
{ "Spider", &cWSSAnvil::LoadSpiderFromNBT },
{ "minecraft:spider", &cWSSAnvil::LoadSpiderFromNBT },
{ "Squid", &cWSSAnvil::LoadSquidFromNBT },
{ "minecraft:squid", &cWSSAnvil::LoadSquidFromNBT },
{ "Witch", &cWSSAnvil::LoadWitchFromNBT },
{ "minecraft:witch", &cWSSAnvil::LoadWitchFromNBT },
{ "WitherBoss", &cWSSAnvil::LoadWitherFromNBT },
{ "minecraft:wither", &cWSSAnvil::LoadWitherFromNBT },
{ "WitherSkeleton", &cWSSAnvil::LoadWitherSkeletonFromNBT },
{ "minecraft:wither_skeleton", &cWSSAnvil::LoadWitherSkeletonFromNBT },
{ "Wolf", &cWSSAnvil::LoadWolfFromNBT },
{ "minecraft:wolf", &cWSSAnvil::LoadWolfFromNBT },
{ "Zombie", &cWSSAnvil::LoadZombieFromNBT },
{ "minecraft:zombie", &cWSSAnvil::LoadZombieFromNBT },
{ "PigZombie", &cWSSAnvil::LoadPigZombieFromNBT },
{ "minecraft:zombie_pigman", &cWSSAnvil::LoadPigZombieFromNBT },
{ "ZombieVillager", &cWSSAnvil::LoadZombieVillagerFromNBT },
{ "minecraft:zombie_villager", &cWSSAnvil::LoadZombieVillagerFromNBT },
{ "minecraft:ender_pearl", &cWSSAnvil::LoadThrownEnderpearlFromNBT }
};
// TODO: flatten monster\projectile into one entity type enum
auto it = EntityTypeToFunction.find(AString(a_IDTag, a_IDTagLength));
if (it != EntityTypeToFunction.end())
{
(this->*it->second)(a_Entities, a_NBT, a_EntityTagIdx);
return;
}
const auto StatInfo = NamespaceSerializer::SplitNamespacedID({ a_IDTag, a_IDTagLength });
if (StatInfo.first == NamespaceSerializer::Namespace::Unknown)
{
return;
}
switch (NamespaceSerializer::ToMonsterType(StatInfo.second))
{
case mtBat: return LoadBatFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtBlaze: return LoadBlazeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtCat: return LoadCatFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtCaveSpider: return LoadCaveSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtChicken: return LoadChickenFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtCod: return LoadCodFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtCow: return LoadCowFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtCreeper: return LoadCreeperFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtDolphin: return LoadDolphinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtDonkey: return LoadDonkeyFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtDrowned: return LoadDrownedFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtElderGuardian: return LoadElderGuardianFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtEnderDragon: return LoadEnderDragonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtEnderman: return LoadEndermanFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtEndermite: return LoadEndermiteFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtEvoker: return LoadEvokerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtFox: return LoadFoxFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtGhast: return LoadGhastFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtGiant: return LoadGiantFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtGuardian: return LoadGuardianFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtHorse: return LoadHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtHoglin: return LoadHoglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtHusk: return LoadHuskFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtIllusioner: return LoadIllusionerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtIronGolem: return LoadVillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtLlama: return LoadIronGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtMagmaCube: return LoadLlamaFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtMooshroom: return LoadMagmaCubeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtMule: return LoadMooshroomFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtOcelot: return LoadMuleFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPanda: return LoadOcelotFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtParrot: return LoadPandaFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPhantom: return LoadParrotFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPig: return LoadPhantomFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPiglin: return LoadPigFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPiglinBrute: return LoadPiglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPillager: return LoadPiglinBruteFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPolarBear: return LoadPillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtPufferfish: return LoadPolarBearFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtRabbit: return LoadPufferfishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtRavager: return LoadRabbitFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSalmon: return LoadRavagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSheep: return LoadSalmonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtShulker: return LoadSheepFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSilverfish: return LoadShulkerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSkeleton: return LoadSilverfishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSkeletonHorse: return LoadSkeletonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSlime: return LoadSlimeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSnowGolem: return LoadSnowGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSpider: return LoadSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtSquid: return LoadSquidFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtStray: return LoadStrayFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtStrider: return LoadStriderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtTraderLlama: return LoadTraderLlamaFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtTropicalFish: return LoadTropicalFishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtTurtle: return LoadTurtleFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtVex: return LoadVexFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtVillager: return LoadVillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtVindicator: return LoadVindicatorFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtWanderingTrader: return LoadWanderingTraderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtWitch: return LoadWitchFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtWither: return LoadWitherFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtWitherSkeleton: return LoadWitherSkeletonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtWolf: return LoadWolfFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtZoglin: return LoadZoglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtZombie: return LoadZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtZombieHorse: return LoadZombieHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtZombifiedPiglin: return LoadZombifiedPiglinFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtZombieVillager: return LoadZombieVillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
case mtInvalidType: break;
}
// TODO: other entities
}
@ -2290,6 +2334,15 @@ void cWSSAnvil::LoadBlazeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
void cWSSAnvil::LoadCatFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadCaveSpiderFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cCaveSpider> Monster = std::make_unique<cCaveSpider>();
@ -2330,6 +2383,15 @@ void cWSSAnvil::LoadChickenFromNBT(cEntityList & a_Entities, const cParsedNBT &
void cWSSAnvil::LoadCodFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadCowFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cCow> Monster = std::make_unique<cCow>();
@ -2370,6 +2432,42 @@ void cWSSAnvil::LoadCreeperFromNBT(cEntityList & a_Entities, const cParsedNBT &
void cWSSAnvil::LoadDolphinFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadDonkeyFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadDrownedFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadElderGuardianFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadEnderDragonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cEnderDragon> Monster = std::make_unique<cEnderDragon>();
@ -2410,6 +2508,33 @@ void cWSSAnvil::LoadEndermanFromNBT(cEntityList & a_Entities, const cParsedNBT &
void cWSSAnvil::LoadEndermiteFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadEvokerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadFoxFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadGhastFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cGhast> Monster = std::make_unique<cGhast>();
@ -2516,6 +2641,33 @@ void cWSSAnvil::LoadHorseFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
void cWSSAnvil::LoadHoglinFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadHuskFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadIllusionerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadIronGolemFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cIronGolem> Monster = std::make_unique<cIronGolem>();
@ -2536,6 +2688,15 @@ void cWSSAnvil::LoadIronGolemFromNBT(cEntityList & a_Entities, const cParsedNBT
void cWSSAnvil::LoadLlamaFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadMagmaCubeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
int SizeIdx = a_NBT.FindChildByName(a_TagIdx, "Size");
@ -2585,6 +2746,15 @@ void cWSSAnvil::LoadMooshroomFromNBT(cEntityList & a_Entities, const cParsedNBT
void cWSSAnvil::LoadMuleFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadOcelotFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cOcelot> Monster = std::make_unique<cOcelot>();
@ -2639,6 +2809,33 @@ void cWSSAnvil::LoadOcelotFromNBT(cEntityList & a_Entities, const cParsedNBT & a
void cWSSAnvil::LoadPandaFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadParrotFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadPhantomFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cPig> Monster = std::make_unique<cPig>();
@ -2672,6 +2869,51 @@ void cWSSAnvil::LoadPigFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NB
void cWSSAnvil::LoadPiglinFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadPiglinBruteFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadPillagerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadPolarBearFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadPufferfishFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadRabbitFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "RabbitType");
@ -2716,6 +2958,24 @@ void cWSSAnvil::LoadRabbitFromNBT(cEntityList & a_Entities, const cParsedNBT & a
void cWSSAnvil::LoadRavagerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadSalmonFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
int ColorIdx = a_NBT.FindChildByName(a_TagIdx, "Color");
@ -2762,6 +3022,15 @@ void cWSSAnvil::LoadSheepFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
void cWSSAnvil::LoadShulkerFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadSilverfishFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cSilverfish> Monster = std::make_unique<cSilverfish>();
@ -2815,6 +3084,15 @@ void cWSSAnvil::LoadSkeletonFromNBT(cEntityList & a_Entities, const cParsedNBT &
void cWSSAnvil::LoadSkeletonHorseFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadSlimeFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
int SizeIdx = a_NBT.FindChildByName(a_TagIdx, "Size");
@ -2904,6 +3182,60 @@ void cWSSAnvil::LoadSquidFromNBT(cEntityList & a_Entities, const cParsedNBT & a_
void cWSSAnvil::LoadStrayFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadStriderFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadTraderLlamaFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadTropicalFishFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadTurtleFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadVexFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadVillagerFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "Profession");
@ -2946,6 +3278,24 @@ void cWSSAnvil::LoadVillagerFromNBT(cEntityList & a_Entities, const cParsedNBT &
void cWSSAnvil::LoadVindicatorFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadWanderingTraderFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadWitchFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cWitch> Monster = std::make_unique<cWitch>();
@ -3088,6 +3438,15 @@ void cWSSAnvil::LoadWolfFromNBT(cEntityList & a_Entities, const cParsedNBT & a_N
void cWSSAnvil::LoadZoglinFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadZombieFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cZombie> Monster = std::make_unique<cZombie>();
@ -3121,7 +3480,16 @@ void cWSSAnvil::LoadZombieFromNBT(cEntityList & a_Entities, const cParsedNBT & a
void cWSSAnvil::LoadPigZombieFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
void cWSSAnvil::LoadZombieHorseFromNBT(cEntityList &a_Entities, const cParsedNBT &a_NBT, int a_TagIdx)
{
// TODO
}
void cWSSAnvil::LoadZombifiedPiglinFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cZombiePigman> Monster = std::make_unique<cZombiePigman>();
if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx))

View File

@ -205,36 +205,72 @@ protected:
void LoadBatFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadBlazeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadCatFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadCaveSpiderFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadChickenFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadCodFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadCowFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadCreeperFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadDolphinFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadDonkeyFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadDrownedFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadElderGuardianFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadEnderDragonFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadEndermanFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadEndermiteFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadEvokerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadFoxFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadGhastFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadGiantFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadGuardianFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadHorseFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadHoglinFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadHuskFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadIllusionerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadIronGolemFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadLlamaFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMagmaCubeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMooshroomFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMuleFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadOcelotFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPandaFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadParrotFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPhantomFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPigFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPiglinFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPiglinBruteFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPillagerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPolarBearFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPufferfishFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadRabbitFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadRavagerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSalmonFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSheepFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadShulkerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSilverfishFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSkeletonFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSkeletonHorseFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSlimeFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSnowGolemFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSpiderFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadSquidFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadStrayFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadStriderFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadTraderLlamaFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadTropicalFishFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadTurtleFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadVexFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadVillagerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadVindicatorFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadWanderingTraderFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadWitchFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadWitherFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadWitherSkeletonFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadWolfFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadZoglinFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPigZombieFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadZombieHorseFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadZombifiedPiglinFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadZombieVillagerFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
/** Loads the owner name and UUID from the entity at the specified NBT tag.