diff --git a/Minecraft.Client/CustomHeadLayer.cpp b/Minecraft.Client/CustomHeadLayer.cpp index 408409ce..90dc3684 100644 --- a/Minecraft.Client/CustomHeadLayer.cpp +++ b/Minecraft.Client/CustomHeadLayer.cpp @@ -5,12 +5,15 @@ #include "SkullTileRenderer.h" #include "TileRenderer.h" #include "EntityRenderDispatcher.h" +#include "Minecraft.h" #include "../Minecraft.World/ItemInstance.h" #include "../Minecraft.World/Item.h" #include "../Minecraft.World/Tile.h" #include "../Minecraft.World/SkullItem.h" #include "../Minecraft.World/SkullTileEntity.h" #include "../Minecraft.World/LivingEntity.h" +#include "../Minecraft.World/Facing.h" + CustomHeadLayer::CustomHeadLayer(ModelPart* headPart, LivingEntityRenderer* parentRenderer) : headPart(headPart), parentRenderer(parentRenderer) @@ -27,51 +30,78 @@ void CustomHeadLayer::render(shared_ptr mob, float headRot, float headRotX, float scale, bool useCompiled) { - if (mob->instanceof(eTYPE_PLAYER)) return; - - if (!headPart) return; - + shared_ptr helmet = mob->getArmor(3); if (!helmet) return; Item* item = helmet->getItem(); if (!item) return; - - if (dynamic_cast(item)) return; - - if (item->id >= 256) return; - - - EntityRenderDispatcher* dispatcher = parentRenderer ? parentRenderer->entityRenderDispatcher : nullptr; - - glPushMatrix(); - headPart->translateTo(1.0f / 16.0f); - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - - - if (item->id > 0 - && item->id < Tile::TILE_NUM_COUNT - && Tile::tiles[item->id] != nullptr - && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) + if (mob->instanceof(eTYPE_PLAYER)) { - float s = 10.0f / 16.0f; - glTranslatef(0.0f, -4.0f / 16.0f, 0.0f); - glRotatef(90.0f, 0.0f, 1.0f, 0.0f); - glScalef(s, -s, s); - - - TileRenderer tr; - tr.renderTile(Tile::tiles[item->id], helmet->getAuxValue(), 1.0f, 1.0f, useCompiled); - glPopMatrix(); - return; + _SkinAdjustments adj; + mob->getSkinAdjustments(&adj); + if ((adj.data[0] & 0x100) != 0) return; } - - if (dispatcher && dispatcher->itemInHandRenderer) + bool isBaby = mob->isBaby(); + bool isSkull = (item->id == Tile::skull_Id); + + glPushMatrix(); + + + if (isBaby) + glTranslatef(0.0f, 0.2f, 0.0f); + + + headPart->translateTo(0.0625f); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + + if (isSkull) { - dispatcher->itemInHandRenderer->renderItem(mob, helmet, 0); + + glScalef(1.1875f, -1.1875f, -1.1875f); + + if (isBaby) + glTranslatef(0.0f, 0.0625f, 0.0f); + + if (SkullTileRenderer::instance) + { + int skullType = helmet->getAuxValue() & 0xF; + wstring extra = L""; + if (helmet->hasTag() && helmet->getTag()->contains(L"SkullOwner")) + extra = helmet->getTag()->getString(L"SkullOwner"); + + SkullTileRenderer::instance->renderSkull( + -0.5f, 0.0f, -0.5f, + Facing::UP, + 180.0f, + skullType, + extra + ); + } + } + else if (item->id < 256) + { + + glTranslatef(0.0f, -0.25f, 0.0f); + glRotatef(180.0f, 0.0f, 1.0f, 0.0f); + glScalef(0.625f, -0.625f, -0.625f); + + if (isBaby) + glTranslatef(0.0f, 0.1875f, 0.0f); + + glRotatef(90.0f, 0.0f, 1.0f, 0.0f); + + + Minecraft* mc = Minecraft::GetInstance(); + if (mc) + { + auto* iihr = mc->getItemInHandRenderer(); + if (iihr) + iihr->renderItem(mob, helmet, 0, true); + } } glPopMatrix(); diff --git a/Minecraft.Client/Minecraft.h b/Minecraft.Client/Minecraft.h index 9425cf9f..0845edb3 100644 --- a/Minecraft.Client/Minecraft.h +++ b/Minecraft.Client/Minecraft.h @@ -79,6 +79,7 @@ private: static void levelTickUpdateFunc(void* pParam); static void levelTickThreadInitFunc(); + public: int width, height; int width_phys, height_phys; // 4J - added @@ -122,7 +123,7 @@ public: void storeExtraLocalPlayer(int idx); void updatePlayerViewportAssignments(); int unoccupiedQuadrant; // 4J - added - + ItemInHandRenderer* getItemInHandRenderer() const { return localitemInHandRenderers[localPlayerIdx]; }; shared_ptr cameraTargetPlayer; shared_ptr crosshairPickMob; ParticleEngine *particleEngine; diff --git a/Minecraft.World/cmake/sources/Common.cmake b/Minecraft.World/cmake/sources/Common.cmake index 909aa605..8757c517 100644 --- a/Minecraft.World/cmake/sources/Common.cmake +++ b/Minecraft.World/cmake/sources/Common.cmake @@ -433,6 +433,8 @@ set(_MINECRAFT_WORLD_COMMON_NET_MINECRAFT_NETWORK_PACKET "${CMAKE_CURRENT_SOURCE_DIR}/XZPacket.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/XZPacket.h" "${CMAKE_CURRENT_SOURCE_DIR}/net.minecraft.network.packet.h" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ParticleType.h" + "${CMAKE_CURRENT_SOURCE_DIR}/../Minecraft.Client/ParticleType.cpp" ) source_group("net/minecraft/network/packet" FILES ${_MINECRAFT_WORLD_COMMON_NET_MINECRAFT_NETWORK_PACKET})