1
0

Load entities from old and new names

This commit is contained in:
Lukas Pioch 2017-06-22 17:30:11 +02:00
parent 8484d05d65
commit cc3a67b9df
2 changed files with 151 additions and 225 deletions

View File

@ -1474,226 +1474,119 @@ cBlockEntity * cWSSAnvil::LoadSignFromNBT(const cParsedNBT & a_NBT, int a_TagIdx
void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_EntityTagIdx, const char * a_IDTag, size_t a_IDTagLength)
{
if (strncmp(a_IDTag, "Boat", a_IDTagLength) == 0)
typedef void (cWSSAnvil::*EntityLoaderFunc)(cEntityList &, const cParsedNBT &, int a_EntityTagIdx);
typedef std::map<AString, EntityLoaderFunc> EntityLoaderMap;
static const EntityLoaderMap EntityTypeToFunction
{
LoadBoatFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "EnderCrystal", a_IDTagLength) == 0)
{ "Boat", &cWSSAnvil::LoadBoatFromNBT },
{ "minecraft:boat", &cWSSAnvil::LoadBoatFromNBT },
{ "EnderCrystal", &cWSSAnvil::LoadEnderCrystalFromNBT },
{ "minecraft:ender_crystal", &cWSSAnvil::LoadEnderCrystalFromNBT },
{ "FallingBlock", &cWSSAnvil::LoadFallingBlockFromNBT },
{ "minecraft:falling_block", &cWSSAnvil::LoadFallingBlockFromNBT },
{ "Minecart", &cWSSAnvil::LoadOldMinecartFromNBT },
{ "MinecartChest", &cWSSAnvil::LoadMinecartCFromNBT },
{ "minecraft:chest_minecart", &cWSSAnvil::LoadMinecartCFromNBT },
{ "MinecartFurnace", &cWSSAnvil::LoadMinecartFFromNBT },
{ "minecraft:furnace_minecart", &cWSSAnvil::LoadMinecartFFromNBT },
{ "MinecartTNT", &cWSSAnvil::LoadMinecartTFromNBT },
{ "minecraft:tnt_minecart", &cWSSAnvil::LoadMinecartTFromNBT },
{ "MinecartHopper", &cWSSAnvil::LoadMinecartHFromNBT },
{ "minecraft:hopper_minecart", &cWSSAnvil::LoadMinecartHFromNBT },
{ "MinecartRideable", &cWSSAnvil::LoadMinecartRFromNBT },
{ "minecraft:minecart", &cWSSAnvil::LoadMinecartRFromNBT },
{ "Item", &cWSSAnvil::LoadPickupFromNBT },
{ "minecraft:item", &cWSSAnvil::LoadPickupFromNBT },
{ "Painting", &cWSSAnvil::LoadPaintingFromNBT },
{ "minecraft:painting", &cWSSAnvil::LoadPaintingFromNBT },
{ "PrimedTnt", &cWSSAnvil::LoadTNTFromNBT },
{ "minecraft:tnt", &cWSSAnvil::LoadTNTFromNBT },
{ "XPOrb", &cWSSAnvil::LoadExpOrbFromNBT },
{ "minecraft:xp_orb", &cWSSAnvil::LoadExpOrbFromNBT },
{ "ItemFrame", &cWSSAnvil::LoadItemFrameFromNBT },
{ "minecraft:item_frame", &cWSSAnvil::LoadItemFrameFromNBT },
{ "Arrow", &cWSSAnvil::LoadArrowFromNBT },
{ "minecraft:arrow", &cWSSAnvil::LoadArrowFromNBT },
{ "SplashPotion", &cWSSAnvil::LoadSplashPotionFromNBT },
{ "minecraft:potion", &cWSSAnvil::LoadSplashPotionFromNBT },
{ "Snowball", &cWSSAnvil::LoadSnowballFromNBT },
{ "minecraft:snowball", &cWSSAnvil::LoadSnowballFromNBT },
{ "Egg", &cWSSAnvil::LoadEggFromNBT },
{ "minecraft:egg", &cWSSAnvil::LoadEggFromNBT },
{ "Fireball", &cWSSAnvil::LoadFireballFromNBT },
{ "minecraft:fireball", &cWSSAnvil::LoadFireballFromNBT },
{ "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 },
{ "Wolf", &cWSSAnvil::LoadWolfFromNBT },
{ "minecraft:wolf", &cWSSAnvil::LoadWolfFromNBT },
{ "Zombie", &cWSSAnvil::LoadZombieFromNBT },
{ "minecraft:zombie", &cWSSAnvil::LoadZombieFromNBT },
{ "PigZombie", &cWSSAnvil::LoadPigZombieFromNBT },
{ "minecraft:zombie_pigman", &cWSSAnvil::LoadPigZombieFromNBT },
};
auto it = EntityTypeToFunction.find(AString(a_IDTag, a_IDTagLength));
if (it != EntityTypeToFunction.end())
{
LoadEnderCrystalFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "FallingBlock", a_IDTagLength) == 0)
{
LoadFallingBlockFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Minecart", a_IDTagLength) == 0)
{
// It is a minecart, old style, find out the type:
int TypeTag = a_NBT.FindChildByName(a_EntityTagIdx, "Type");
if ((TypeTag < 0) || (a_NBT.GetType(TypeTag) != TAG_Int))
{
return;
}
switch (a_NBT.GetInt(TypeTag))
{
case 0: LoadMinecartRFromNBT(a_Entities, a_NBT, a_EntityTagIdx); break; // Rideable minecart
case 1: LoadMinecartCFromNBT(a_Entities, a_NBT, a_EntityTagIdx); break; // Minecart with chest
case 2: LoadMinecartFFromNBT(a_Entities, a_NBT, a_EntityTagIdx); break; // Minecart with furnace
case 3: LoadMinecartTFromNBT(a_Entities, a_NBT, a_EntityTagIdx); break; // Minecart with TNT
case 4: LoadMinecartHFromNBT(a_Entities, a_NBT, a_EntityTagIdx); break; // Minecart with Hopper
}
}
else if (strncmp(a_IDTag, "MinecartRideable", a_IDTagLength) == 0)
{
LoadMinecartRFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "MinecartChest", a_IDTagLength) == 0)
{
LoadMinecartCFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "MinecartFurnace", a_IDTagLength) == 0)
{
LoadMinecartFFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "MinecartTNT", a_IDTagLength) == 0)
{
LoadMinecartTFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "MinecartHopper", a_IDTagLength) == 0)
{
LoadMinecartHFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Item", a_IDTagLength) == 0)
{
LoadPickupFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Painting", a_IDTagLength) == 0)
{
LoadPaintingFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "PrimedTnt", a_IDTagLength) == 0)
{
LoadTNTFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "XPOrb", a_IDTagLength) == 0)
{
LoadExpOrbFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "ItemFrame", a_IDTagLength) == 0)
{
LoadItemFrameFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Arrow", a_IDTagLength) == 0)
{
LoadArrowFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "SplashPotion", a_IDTagLength) == 0)
{
LoadSplashPotionFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Snowball", a_IDTagLength) == 0)
{
LoadSnowballFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Egg", a_IDTagLength) == 0)
{
LoadEggFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Fireball", a_IDTagLength) == 0)
{
LoadFireballFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "SmallFireball", a_IDTagLength) == 0)
{
LoadFireChargeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "ThrownEnderpearl", a_IDTagLength) == 0)
{
LoadThrownEnderpearlFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Bat", a_IDTagLength) == 0)
{
LoadBatFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Blaze", a_IDTagLength) == 0)
{
LoadBlazeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "CaveSpider", a_IDTagLength) == 0)
{
LoadCaveSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Chicken", a_IDTagLength) == 0)
{
LoadChickenFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Cow", a_IDTagLength) == 0)
{
LoadCowFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Creeper", a_IDTagLength) == 0)
{
LoadCreeperFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "EnderDragon", a_IDTagLength) == 0)
{
LoadEnderDragonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Enderman", a_IDTagLength) == 0)
{
LoadEndermanFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Ghast", a_IDTagLength) == 0)
{
LoadGhastFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Giant", a_IDTagLength) == 0)
{
LoadGiantFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Guardian", a_IDTagLength) == 0)
{
LoadGuardianFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Horse", a_IDTagLength) == 0)
{
LoadHorseFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Villager", a_IDTagLength) == 0)
{
LoadVillagerFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "VillagerGolem", a_IDTagLength) == 0)
{
LoadIronGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "LavaSlime", a_IDTagLength) == 0)
{
LoadMagmaCubeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "MushroomCow", a_IDTagLength) == 0)
{
LoadMooshroomFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Ozelot", a_IDTagLength) == 0)
{
LoadOcelotFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Pig", a_IDTagLength) == 0)
{
LoadPigFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Rabbit", a_IDTagLength) == 0)
{
LoadRabbitFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Sheep", a_IDTagLength) == 0)
{
LoadSheepFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Silverfish", a_IDTagLength) == 0)
{
LoadSilverfishFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Skeleton", a_IDTagLength) == 0)
{
LoadSkeletonFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Slime", a_IDTagLength) == 0)
{
LoadSlimeFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "SnowMan", a_IDTagLength) == 0)
{
LoadSnowGolemFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Spider", a_IDTagLength) == 0)
{
LoadSpiderFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Squid", a_IDTagLength) == 0)
{
LoadSquidFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Witch", a_IDTagLength) == 0)
{
LoadWitchFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "WitherBoss", a_IDTagLength) == 0)
{
LoadWitherFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Wolf", a_IDTagLength) == 0)
{
LoadWolfFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "Zombie", a_IDTagLength) == 0)
{
LoadZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
}
else if (strncmp(a_IDTag, "PigZombie", a_IDTagLength) == 0)
{
LoadPigZombieFromNBT(a_Entities, a_NBT, a_EntityTagIdx);
(this->*it->second)(a_Entities, a_NBT, a_EntityTagIdx);
}
// TODO: other entities
}
@ -1702,6 +1595,28 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a
void cWSSAnvil::LoadOldMinecartFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
// It is a minecart, old style, find out the type:
int TypeTag = a_NBT.FindChildByName(a_TagIdx, "Type");
if ((TypeTag < 0) || (a_NBT.GetType(TypeTag) != TAG_Int))
{
return;
}
switch (a_NBT.GetInt(TypeTag))
{
case 0: LoadMinecartRFromNBT(a_Entities, a_NBT, a_TagIdx); break; // Rideable minecart
case 1: LoadMinecartCFromNBT(a_Entities, a_NBT, a_TagIdx); break; // Minecart with chest
case 2: LoadMinecartFFromNBT(a_Entities, a_NBT, a_TagIdx); break; // Minecart with furnace
case 3: LoadMinecartTFromNBT(a_Entities, a_NBT, a_TagIdx); break; // Minecart with TNT
case 4: LoadMinecartHFromNBT(a_Entities, a_NBT, a_TagIdx); break; // Minecart with Hopper
}
}
void cWSSAnvil::LoadBoatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx)
{
std::unique_ptr<cBoat> Boat = cpp14::make_unique<cBoat>(0, 0, 0, cBoat::bmOak);
@ -3167,15 +3082,25 @@ bool cWSSAnvil::LoadEntityBaseFromNBT(cEntity & a_Entity, const cParsedNBT & a_N
bool cWSSAnvil::LoadMonsterBaseFromNBT(cMonster & a_Monster, const cParsedNBT & a_NBT, int a_TagIdx)
{
float DropChance[5];
if (!LoadFloatsListFromNBT(DropChance, 5, a_NBT, a_NBT.FindChildByName(a_TagIdx, "DropChances")))
if (LoadFloatsListFromNBT(DropChance, 5, a_NBT, a_NBT.FindChildByName(a_TagIdx, "DropChances")))
{
return false;
a_Monster.SetDropChanceWeapon(DropChance[0]);
a_Monster.SetDropChanceHelmet(DropChance[1]);
a_Monster.SetDropChanceChestplate(DropChance[2]);
a_Monster.SetDropChanceLeggings(DropChance[3]);
a_Monster.SetDropChanceBoots(DropChance[4]);
}
if (LoadFloatsListFromNBT(DropChance, 2, a_NBT, a_NBT.FindChildByName(a_TagIdx, "HandDropChances")))
{
a_Monster.SetDropChanceWeapon(DropChance[0]);
}
if (LoadFloatsListFromNBT(DropChance, 4, a_NBT, a_NBT.FindChildByName(a_TagIdx, "ArmorDropChances")))
{
a_Monster.SetDropChanceHelmet(DropChance[0]);
a_Monster.SetDropChanceChestplate(DropChance[1]);
a_Monster.SetDropChanceLeggings(DropChance[2]);
a_Monster.SetDropChanceBoots(DropChance[3]);
}
a_Monster.SetDropChanceWeapon(DropChance[0]);
a_Monster.SetDropChanceHelmet(DropChance[1]);
a_Monster.SetDropChanceChestplate(DropChance[2]);
a_Monster.SetDropChanceLeggings(DropChance[3]);
a_Monster.SetDropChanceBoots(DropChance[4]);
int LootTag = a_NBT.FindChildByName(a_TagIdx, "CanPickUpLoot");
if (LootTag > 0)

View File

@ -182,6 +182,7 @@ protected:
void LoadItemFrameFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadPaintingFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadOldMinecartFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMinecartRFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMinecartCFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);
void LoadMinecartFFromNBT (cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx);