From a28d817d6c0a63f0088f4f472e41bb057e2d7655 Mon Sep 17 00:00:00 2001 From: Fireblade <72758695+Firebladedoge229@users.noreply.github.com> Date: Mon, 4 May 2026 21:54:12 -0400 Subject: [PATCH] fix: item frame rotation --- Minecraft.Client/ItemFrameRenderer.cpp | 26 ++++++++--------- Minecraft.World/BlockStateDecoder.cpp | 40 +++++--------------------- Minecraft.World/ItemFrame.cpp | 2 +- 3 files changed, 21 insertions(+), 47 deletions(-) diff --git a/Minecraft.Client/ItemFrameRenderer.cpp b/Minecraft.Client/ItemFrameRenderer.cpp index 83eca84e..f8f0e226 100644 --- a/Minecraft.Client/ItemFrameRenderer.cpp +++ b/Minecraft.Client/ItemFrameRenderer.cpp @@ -139,20 +139,20 @@ void ItemFrameRenderer::drawItem(shared_ptr entity) glTranslatef((-7.25f / 16.0f) * Direction::STEP_X[entity->dir], -0.18f, (-7.25f / 16.0f) * Direction::STEP_Z[entity->dir]); glRotatef(180 + entity->yRot, 0, 1, 0); - glRotatef(-90 * entity->getRotation(), 0, 0, 1); + glRotatef(-45.0f * entity->getRotation(), 0, 0, 1); - switch (entity->getRotation()) - { - case 1: - glTranslatef(-0.16f, -0.16f, 0); - break; - case 2: - glTranslatef(0, -0.32f, 0); - break; - case 3: - glTranslatef(0.16f, -0.16f, 0); - break; - } + static const float offsets[8][2] = { + { 0.0f, 0.0f }, + { -0.08f, -0.08f }, + { -0.16f, -0.16f }, + { -0.08f, -0.24f }, + { 0.0f, -0.32f }, + { 0.08f, -0.24f }, + { 0.16f, -0.16f }, + { 0.08f, -0.08f } + }; + int rotIndex = entity->getRotation() & 0x7; + glTranslatef(offsets[rotIndex][0], offsets[rotIndex][1], 0.0f); if (itemEntity->getItem()->getItem() == Item::map) { diff --git a/Minecraft.World/BlockStateDecoder.cpp b/Minecraft.World/BlockStateDecoder.cpp index dd8d59ea..20e9ba9d 100644 --- a/Minecraft.World/BlockStateDecoder.cpp +++ b/Minecraft.World/BlockStateDecoder.cpp @@ -266,6 +266,13 @@ static std::wstring pressurePlatePropsToString(int composite) return ss.str(); } +static std::wstring facingToString(int facing) +{ + static const std::wstring facingNames[] = { L"down", L"up", L"north", L"south", L"west", L"east" }; + return (facing >= 0 && facing < 6) ? facingNames[facing] : L"unknown"; +} + + static std::wstring dispenserPropsToString(int composite) { int facing = composite & DispenserTile::FACING_MASK; @@ -508,12 +515,6 @@ static std::wstring hayBlockPropsToString(int composite) return ss.str(); } -static std::wstring facingToString(int facing) -{ - static const std::wstring facingNames[] = { L"down", L"up", L"north", L"south", L"west", L"east" }; - return (facing >= 0 && facing < 6) ? facingNames[facing] : L"unknown"; -} - static std::wstring pistonBasePropsToString(int composite) { int facing = PistonBaseTile::getFacing(composite); @@ -640,15 +641,6 @@ static bool registerDoorDecoder() registerDecoder(Tile::acacia_door_Id, fn); registerDecoder(Tile::dark_oak_door_Id, fn); return true; -registerDecoder(Tile::torch_Id, [](int composite)->std::wstring { return torchPropsToString(composite); }); -registerDecoder(Tile::furnace_Id, [](int composite)->std::wstring { return furnacePropsToString(composite); }); -registerDecoder(Tile::furnace_lit_Id, [](int composite)->std::wstring { return furnacePropsToString(composite); }); -registerDecoder(Tile::redStoneOre_Id, [](int composite)->std::wstring { return redstoneOrePropsToString(composite); }); -registerDecoder(Tile::redStoneOre_lit_Id, [](int composite)->std::wstring { return redstoneOrePropsToString(composite); }); -registerDecoder(Tile::redstoneTorch_off_Id, [](int composite)->std::wstring { return redstoneTorchPropsToString(composite); }); -registerDecoder(Tile::redstoneTorch_on_Id, [](int composite)->std::wstring { return redstoneTorchPropsToString(composite); }); -registerDecoder(Tile::redstoneLight_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); -registerDecoder(Tile::redstoneLight_lit_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); } static bool s_doorDecoderRegistered = registerDoorDecoder(); @@ -687,15 +679,6 @@ static bool registerStairDecoder() registerDecoder(Tile::stairs_darkwood_Id, fn); registerDecoder(Tile::stairs_red_sandstone_Id, fn); return true; -registerDecoder(Tile::torch_Id, [](int composite)->std::wstring { return torchPropsToString(composite); }); -registerDecoder(Tile::furnace_Id, [](int composite)->std::wstring { return furnacePropsToString(composite); }); -registerDecoder(Tile::furnace_lit_Id, [](int composite)->std::wstring { return furnacePropsToString(composite); }); -registerDecoder(Tile::redStoneOre_Id, [](int composite)->std::wstring { return redstoneOrePropsToString(composite); }); -registerDecoder(Tile::redStoneOre_lit_Id, [](int composite)->std::wstring { return redstoneOrePropsToString(composite); }); -registerDecoder(Tile::redstoneTorch_off_Id, [](int composite)->std::wstring { return redstoneTorchPropsToString(composite); }); -registerDecoder(Tile::redstoneTorch_on_Id, [](int composite)->std::wstring { return redstoneTorchPropsToString(composite); }); -registerDecoder(Tile::redstoneLight_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); -registerDecoder(Tile::redstoneLight_lit_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); } static bool s_stairDecoderRegistered = registerStairDecoder(); @@ -794,15 +777,6 @@ static bool registerPlantDecoders() registerDecoder(Tile::redstoneLight_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); registerDecoder(Tile::redstoneLight_lit_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); return true; -registerDecoder(Tile::torch_Id, [](int composite)->std::wstring { return torchPropsToString(composite); }); -registerDecoder(Tile::furnace_Id, [](int composite)->std::wstring { return furnacePropsToString(composite); }); -registerDecoder(Tile::furnace_lit_Id, [](int composite)->std::wstring { return furnacePropsToString(composite); }); -registerDecoder(Tile::redStoneOre_Id, [](int composite)->std::wstring { return redstoneOrePropsToString(composite); }); -registerDecoder(Tile::redStoneOre_lit_Id, [](int composite)->std::wstring { return redstoneOrePropsToString(composite); }); -registerDecoder(Tile::redstoneTorch_off_Id, [](int composite)->std::wstring { return redstoneTorchPropsToString(composite); }); -registerDecoder(Tile::redstoneTorch_on_Id, [](int composite)->std::wstring { return redstoneTorchPropsToString(composite); }); -registerDecoder(Tile::redstoneLight_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); -registerDecoder(Tile::redstoneLight_lit_Id, [](int composite)->std::wstring { return redlightPropsToString(composite); }); } static bool s_plantDecoderRegistered = registerPlantDecoders(); diff --git a/Minecraft.World/ItemFrame.cpp b/Minecraft.World/ItemFrame.cpp index f5988b9f..497cbd6f 100644 --- a/Minecraft.World/ItemFrame.cpp +++ b/Minecraft.World/ItemFrame.cpp @@ -107,7 +107,7 @@ int ItemFrame::getRotation() void ItemFrame::setRotation(int rotation) { - getEntityData()->set(DATA_ROTATION, static_cast(rotation % 4)); + getEntityData()->set(DATA_ROTATION, static_cast(rotation % 8)); } void ItemFrame::addAdditonalSaveData(CompoundTag *tag)