fix: item frame rotation

This commit is contained in:
Fireblade 2026-05-04 21:54:12 -04:00
parent b750c4bbf4
commit a28d817d6c
3 changed files with 21 additions and 47 deletions

View file

@ -139,20 +139,20 @@ void ItemFrameRenderer::drawItem(shared_ptr<ItemFrame> 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)
{

View file

@ -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();

View file

@ -107,7 +107,7 @@ int ItemFrame::getRotation()
void ItemFrame::setRotation(int rotation)
{
getEntityData()->set(DATA_ROTATION, static_cast<byte>(rotation % 4));
getEntityData()->set(DATA_ROTATION, static_cast<byte>(rotation % 8));
}
void ItemFrame::addAdditonalSaveData(CompoundTag *tag)