From 60bcc06f43e0c249204149153976e534b239d138 Mon Sep 17 00:00:00 2001 From: Mat Date: Sat, 4 Apr 2020 14:44:17 +0300 Subject: Implement wither skeletons (#4563) --- src/WorldStorage/WSSAnvil.cpp | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'src/WorldStorage/WSSAnvil.cpp') diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp index 65facd817..31934e181 100755 --- a/src/WorldStorage/WSSAnvil.cpp +++ b/src/WorldStorage/WSSAnvil.cpp @@ -1560,6 +1560,8 @@ void cWSSAnvil::LoadEntityFromNBT(cEntityList & a_Entities, const cParsedNBT & a { "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 }, @@ -2660,15 +2662,20 @@ void cWSSAnvil::LoadSilverfishFromNBT(cEntityList & a_Entities, const cParsedNBT void cWSSAnvil::LoadSkeletonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) { + // Wither skeleton is a separate mob in Minecraft 1.11+, but we need this to + // load them from older worlds where wither skeletons were only a skeleton with a flag int TypeIdx = a_NBT.FindChildByName(a_TagIdx, "SkeletonType"); - if (TypeIdx < 0) + + std::unique_ptr Monster; + if ((TypeIdx > 0) && (a_NBT.GetByte(TypeIdx) == 1)) { - return; + Monster = cpp14::make_unique(); + } + else + { + Monster = cpp14::make_unique(); } - bool Type = ((a_NBT.GetByte(TypeIdx) == 1) ? true : false); - - std::unique_ptr Monster = cpp14::make_unique(Type); if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx)) { return; @@ -2863,6 +2870,26 @@ void cWSSAnvil::LoadWitherFromNBT(cEntityList & a_Entities, const cParsedNBT & a +void cWSSAnvil::LoadWitherSkeletonFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) +{ + auto Monster = cpp14::make_unique(); + if (!LoadEntityBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx)) + { + return; + } + + if (!LoadMonsterBaseFromNBT(*Monster.get(), a_NBT, a_TagIdx)) + { + return; + } + + a_Entities.emplace_back(std::move(Monster)); +} + + + + + void cWSSAnvil::LoadWolfFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) { std::unique_ptr Monster = cpp14::make_unique(); -- cgit v1.2.3