From 689536603bd1e4965bb9fdf5eac796a8f9934ba8 Mon Sep 17 00:00:00 2001 From: dofes <91889957+dofes@users.noreply.github.com> Date: Thu, 18 Jan 2024 21:54:48 +0800 Subject: [PATCH] fix: fix Dataitem alignment error --- src/ll/test/TestDataItem.cpp | 36 +++++++++++++++++++++++++++++++++++ src/mc/enums/DataItemType.h | 2 +- src/mc/world/actor/DataItem.h | 6 +++--- 3 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 src/ll/test/TestDataItem.cpp diff --git a/src/ll/test/TestDataItem.cpp b/src/ll/test/TestDataItem.cpp new file mode 100644 index 0000000000..058aeec24d --- /dev/null +++ b/src/ll/test/TestDataItem.cpp @@ -0,0 +1,36 @@ +#include "ll/api/memory/Hook.h" +#include "ll/api/service/Bedrock.h" +#include "mc/deps/core/utility/BinaryStream.h" +#include "mc/network/MinecraftPackets.h" +#include "mc/network/packet/SetActorDataPacket.h" +#include "mc/world/actor/Actor.h" +#include "mc/world/actor/DataItem.h" +#include "mc/world/actor/item/ItemActor.h" +#include "mc/world/actor/player/Player.h" +#include "mc/world/level/Level.h" +#include +#include + +std::shared_ptr buildSetActorDataPacketPacket(ItemActor* iac) { + bool viewable = true; + std::vector> DataItems; + DataItems.emplace_back(DataItem::create(ActorDataIDs::Name, iac->item().getTypeName())); + DataItems.emplace_back(DataItem::create(ActorDataIDs::NametagAlwaysShow, (signed char)viewable)); + BinaryStream bs; + bs.writeUnsignedVarInt64(iac->getRuntimeID()); + bs.writeType(DataItems); + bs.writeUnsignedVarInt(0); + bs.writeUnsignedVarInt(0); + bs.writeUnsignedVarInt64(0); + auto packet = MinecraftPackets::createPacket(MinecraftPacketIds::SetActorData); + packet->read(bs); + return std::static_pointer_cast(packet); +} + +LL_AUTO_TYPE_INSTANCE_HOOK(ACTickHook, HookPriority::Normal, ItemActor, &ItemActor::postNormalTick, void) { + origin(); + ll::service::getLevel()->forEachPlayer([&](Player& player) { + player.sendNetworkPacket(*buildSetActorDataPacketPacket(this)); + return true; + }); +} \ No newline at end of file diff --git a/src/mc/enums/DataItemType.h b/src/mc/enums/DataItemType.h index 642d7d6fbc..7809f432e0 100644 --- a/src/mc/enums/DataItemType.h +++ b/src/mc/enums/DataItemType.h @@ -2,7 +2,7 @@ #include "mc/_HeaderOutputPredefine.h" -enum class DataItemType { +enum class DataItemType : byte { Byte = 0x0, Short = 0x1, Int = 0x2, diff --git a/src/mc/world/actor/DataItem.h b/src/mc/world/actor/DataItem.h index d940b742ab..c20b7ae5f3 100644 --- a/src/mc/world/actor/DataItem.h +++ b/src/mc/world/actor/DataItem.h @@ -70,9 +70,9 @@ class DataItem2 : public DataItem { [[nodiscard]] constexpr T& value() { return mValue; }; - [[nodiscard]] constexpr operator T const&() const { return mValue; }; + [[nodiscard]] constexpr explicit operator T const&() const { return mValue; }; - [[nodiscard]] constexpr operator T&() { return mValue; }; + [[nodiscard]] constexpr explicit operator T&() { return mValue; }; template constexpr void setData(T2&& value) { @@ -85,7 +85,7 @@ class DataItem2 : public DataItem { return *this; } template - constexpr DataItem2(ushort key, Args&&... args) + constexpr explicit DataItem2(ushort key, Args&&... args) : DataItem((::DataItemType)DataItem::TypeList::index, (::ActorDataIDs)key), mValue(std::forward(args)...) {} };