From db4f09ffb8aaa62c0457e2f5a87dd4ef79a0e5c0 Mon Sep 17 00:00:00 2001 From: DrPerkyLegit Date: Sun, 31 May 2026 11:30:27 -0400 Subject: [PATCH] items now render in the hand when they exist --- Minecraft.Client/ArmorStandRenderer.cpp | 77 ++++++++++++++++++++++++- Minecraft.Client/ArmorStandRenderer.h | 2 + 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/Minecraft.Client/ArmorStandRenderer.cpp b/Minecraft.Client/ArmorStandRenderer.cpp index 96337d92..77bc7c61 100644 --- a/Minecraft.Client/ArmorStandRenderer.cpp +++ b/Minecraft.Client/ArmorStandRenderer.cpp @@ -84,9 +84,22 @@ void ArmorStandRenderer::render(shared_ptr entity, double x, double y, double z, float rot, float a) { + shared_ptr mob = dynamic_pointer_cast(entity); + + float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : mob->getBrightness(a); + glColor3f(brightness, brightness, brightness); + shared_ptr item = mob->getCarriedItem(); + + prepareCarriedItem(mob, item); + LivingEntityRenderer::render(entity, x, y, z, rot, a); } +void ArmorStandRenderer::prepareCarriedItem(shared_ptr mob, shared_ptr item) +{ + armorLayer->armorModel1->holdingRightHand = armorLayer->armorModel2->holdingRightHand = item != nullptr ? 1 : 0; +} + void ArmorStandRenderer::renderModel(shared_ptr mob, float wp, float ws, float bob, float headRotMinusBodyRot, @@ -165,7 +178,69 @@ void ArmorStandRenderer::renderModel(shared_ptr mob, void ArmorStandRenderer::additionalRendering(shared_ptr mob, float a) { - + + std::shared_ptr item = mob->getCarriedItem(); + if (item != nullptr) + { + glPushMatrix(); + + ArmorStandModel* standModel = ((ArmorStandModel*)model); + + if (standModel->young) { + float s = 0.5f; + glTranslatef(0 / 16.0f, 10 / 16.0f, 0 / 16.0f); + glRotatef(-20, -1, 0, 0); + glScalef(s, s, s); + } + + + standModel->arm1->translateTo(1 / 16.0f); + glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); + + if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape()) && item->id != Tile::barrier_Id) + { + float s = 8 / 16.0f; + glTranslatef(-0 / 16.0f, 3 / 16.0f, -5 / 16.0f); + s *= 0.75f; + glRotatef(20, 1, 0, 0); + glRotatef(45, 0, 1, 0); + glScalef(-s, -s, s); + } + else if (item->id == Item::bow_Id) + { + float s = 10 / 16.0f; + glTranslatef(0 / 16.0f, 2 / 16.0f, 5 / 16.0f); + glRotatef(-20, 0, 1, 0); + glScalef(s, -s, s); + glRotatef(-100, 1, 0, 0); + glRotatef(45, 0, 1, 0); + } + else if (Item::items[item->id]->isHandEquipped()) + { + float s = 10 / 16.0f; + glTranslatef(0, 3 / 16.0f, 0); + glScalef(s, -s, s); + glRotatef(-100, 1, 0, 0); + glRotatef(45, 0, 1, 0); + } + else + { + float s = 6 / 16.0f; + glTranslatef(+4 / 16.0f, +3 / 16.0f, -3 / 16.0f); + glScalef(s, s, s); + glRotatef(60, 0, 0, 1); + glRotatef(-90, 1, 0, 0); + glRotatef(20, 0, 0, 1); + } + + this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); + if (item->getItem()->hasMultipleSpriteLayers()) + { + this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 1); + } + + glPopMatrix(); + } } diff --git a/Minecraft.Client/ArmorStandRenderer.h b/Minecraft.Client/ArmorStandRenderer.h index 9742f31e..9eda1077 100644 --- a/Minecraft.Client/ArmorStandRenderer.h +++ b/Minecraft.Client/ArmorStandRenderer.h @@ -47,5 +47,7 @@ public: float headRotMinusBodyRot, float headRotx, float scale) override; virtual int prepareArmor(shared_ptr mob, int layer, float a) override; + void prepareCarriedItem(shared_ptr mob, shared_ptr item); + virtual void additionalRendering(shared_ptr mob, float a) override; }; \ No newline at end of file