From 961d5eb420182add0b6cb4d92f260b885563389c Mon Sep 17 00:00:00 2001 From: 12xx12 <44411062+12xx12@users.noreply.github.com> Date: Thu, 29 Oct 2020 21:47:20 +0100 Subject: Add beam target, configurable base visibility to Ender Crystals (#5010) * Fixes #4990 Co-authored-by: 12xx12 <12xx12100@gmail.com> --- src/WorldStorage/NBTChunkSerializer.cpp | 10 ++++++++++ src/WorldStorage/WSSAnvil.cpp | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 1 deletion(-) (limited to 'src/WorldStorage') diff --git a/src/WorldStorage/NBTChunkSerializer.cpp b/src/WorldStorage/NBTChunkSerializer.cpp index f78f7029f..d159f6e49 100644 --- a/src/WorldStorage/NBTChunkSerializer.cpp +++ b/src/WorldStorage/NBTChunkSerializer.cpp @@ -683,6 +683,16 @@ public: { mWriter.BeginCompound(""); AddBasicEntity(a_EnderCrystal, "EnderCrystal"); + mWriter.AddByte("ShowBottom", a_EnderCrystal->ShowsBottom() ? 1 : 0); + if (a_EnderCrystal->DisplaysBeam()) + { + mWriter.BeginCompound("BeamTarget"); + const auto & BeamTarget = a_EnderCrystal->GetBeamTarget(); + mWriter.AddInt("X", BeamTarget.x); + mWriter.AddInt("Y", BeamTarget.y); + mWriter.AddInt("Z", BeamTarget.z); + mWriter.EndCompound(); + } mWriter.EndCompound(); } diff --git a/src/WorldStorage/WSSAnvil.cpp b/src/WorldStorage/WSSAnvil.cpp index 03e60bb26..c7b4c7e1f 100755 --- a/src/WorldStorage/WSSAnvil.cpp +++ b/src/WorldStorage/WSSAnvil.cpp @@ -1718,11 +1718,42 @@ void cWSSAnvil::LoadBoatFromNBT(cEntityList & a_Entities, const cParsedNBT & a_N void cWSSAnvil::LoadEnderCrystalFromNBT(cEntityList & a_Entities, const cParsedNBT & a_NBT, int a_TagIdx) { - auto EnderCrystal = std::make_unique(Vector3d()); + auto EnderCrystal = std::make_unique(Vector3d(), false); if (!LoadEntityBaseFromNBT(*EnderCrystal.get(), a_NBT, a_TagIdx)) { return; } + + int CurrentLine = a_NBT.FindChildByName(a_TagIdx, "BeamTarget"); + if (CurrentLine > 0) + { + EnderCrystal->SetDisplayBeam(true); + if (a_NBT.GetType(CurrentLine) == TAG_Compound) + { + Vector3d BeamTarget = {0, 0, 0}; + int CoordinateLine = a_NBT.FindChildByName(CurrentLine, "X"); + if (CoordinateLine > 0) + { + BeamTarget.x = a_NBT.GetInt(CoordinateLine); + } + CoordinateLine = a_NBT.FindChildByName(CurrentLine, "Y"); + if (CoordinateLine > 0) + { + BeamTarget.y = a_NBT.GetInt(CoordinateLine); + } + CoordinateLine = a_NBT.FindChildByName(CurrentLine, "Z"); + if (CoordinateLine > 0) + { + BeamTarget.z = a_NBT.GetInt(CoordinateLine); + } + } + } + CurrentLine = a_NBT.FindChildByName(a_TagIdx, "ShowBottom"); + if (CurrentLine > 0) + { + EnderCrystal->SetShowBottom(a_NBT.GetByte(CurrentLine) == 1); + } + a_Entities.emplace_back(std::move(EnderCrystal)); } -- cgit v1.2.3