From 251c00ecd001dbd090a0d4f15ce65199e9948821 Mon Sep 17 00:00:00 2001 From: SevenToaster509 Date: Sat, 18 Apr 2026 14:35:13 +0100 Subject: [PATCH] fix: skulls reimplement player skull rendering to be on armor layer make skull height for armor stands be accurate to tu31 (matched via xenia) --- Minecraft.Client/CustomHeadLayer.cpp | 3 +- Minecraft.Client/PlayerRenderer.cpp | 497 +++++++++++++++------------ Minecraft.Client/PlayerRenderer.h | 3 +- 3 files changed, 276 insertions(+), 227 deletions(-) diff --git a/Minecraft.Client/CustomHeadLayer.cpp b/Minecraft.Client/CustomHeadLayer.cpp index 6422fa07..72f9955a 100644 --- a/Minecraft.Client/CustomHeadLayer.cpp +++ b/Minecraft.Client/CustomHeadLayer.cpp @@ -70,7 +70,8 @@ void CustomHeadLayer::render(shared_ptr mob, extra = helmet->getTag()->getString(L"SkullOwner"); SkullTileRenderer::instance->renderSkull( - -0.5f, 0.0f, -0.5f, + //Skull on armor stand is slightly lowered + -0.5f, -0.05f, -0.5f, Facing::UP, 180.0f, skullType, diff --git a/Minecraft.Client/PlayerRenderer.cpp b/Minecraft.Client/PlayerRenderer.cpp index b721371a..2d25f54d 100644 --- a/Minecraft.Client/PlayerRenderer.cpp +++ b/Minecraft.Client/PlayerRenderer.cpp @@ -18,7 +18,6 @@ #include "Textures.h" #include "Skins.h" - ResourceLocation PlayerRenderer::SKELETON_LOCATION = ResourceLocation(TN_MOB_SKELETON); ResourceLocation PlayerRenderer::WITHER_SKELETON_LOCATION = ResourceLocation(TN_MOB_WITHER_SKELETON); ResourceLocation PlayerRenderer::ZOMBIE_LOCATION = ResourceLocation(TN_MOB_ZOMBIE); @@ -49,12 +48,12 @@ static unsigned int nametagColorForIndex(int index) float r = 0.f, g = 0.f, b = 0.f; switch (i % 6) { - case 0: r = 1.f; g = t; b = 0.f; break; - case 1: r = q; g = 1.f; b = 0.f; break; - case 2: r = 0.f; g = 1.f; b = t; break; - case 3: r = 0.f; g = q; b = 1.f; break; - case 4: r = t; g = 0.f; b = 1.f; break; - default: r = 1.f; g = 0.f; b = q; break; + case 0: r = 1.f; g = t; b = 0.f; break; + case 1: r = q; g = 1.f; b = 0.f; break; + case 2: r = 0.f; g = 1.f; b = t; break; + case 3: r = 0.f; g = q; b = 1.f; break; + case 4: r = t; g = 0.f; b = 1.f; break; + default: r = 1.f; g = 0.f; b = q; break; } int ri = (int)(r * 255.f) & 0xff, gi = (int)(g * 255.f) & 0xff, bi = (int)(b * 255.f) & 0xff; return 0xff000000u | (ri << 16) | (gi << 8) | bi; @@ -65,55 +64,58 @@ static unsigned int nametagColorForIndex(int index) ResourceLocation PlayerRenderer::DEFAULT_LOCATION = ResourceLocation(TN_MOB_CHAR); -PlayerRenderer::PlayerRenderer() : LivingEntityRenderer( new HumanoidModel(0), 0.5f, true, true ) +PlayerRenderer::PlayerRenderer() : LivingEntityRenderer(new HumanoidModel(0), 0.5f, true, true) { - humanoidModel = static_cast(model); - humanoidModelSlim = static_cast(modelSlim); - newHumanoidModel = static_cast(newModel); - newHumanoidModelSlim = static_cast(newModelSlim); + humanoidModel = static_cast(model); + humanoidModelSlim = static_cast(modelSlim); + newHumanoidModel = static_cast(newModel); + newHumanoidModelSlim = static_cast(newModelSlim); - armorParts1 = new HumanoidModel(1.0f); - armorParts2 = new HumanoidModel(0.5f); - armorParts3 = new HumanoidModel(0.5f); + armorParts1 = new HumanoidModel(1.0f); + armorParts2 = new HumanoidModel(0.5f); + armorParts3 = new HumanoidModel(0.5f); } unsigned int PlayerRenderer::getNametagColour(int index) { - if( index >= 0 && index < MINECRAFT_NET_MAX_PLAYERS) + if (index >= 0 && index < MINECRAFT_NET_MAX_PLAYERS) return nametagColorForIndex(index); return 0xFF000000; } int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, float a) { + // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr player = dynamic_pointer_cast(_player); - unsigned int uiAnimOverrideBitmask=player->getAnimOverrideBitmask(); - if(uiAnimOverrideBitmask&(1<getAnimOverrideBitmask(); + if (uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_DontRenderArmour)) { return -1; } - shared_ptr itemInstance = player->inventory->getArmor(3 - layer); - if (itemInstance != nullptr) + shared_ptr itemInstance = player->inventory->getArmor(3 - layer); + if (itemInstance != nullptr) { - Item *item = itemInstance->getItem(); - if (dynamic_cast(item)) + Item* item = itemInstance->getItem(); + if (dynamic_cast(item)) { - ArmorItem *armorItem = dynamic_cast(item); + ArmorItem* armorItem = dynamic_cast(item); bindTexture(HumanoidMobRenderer::getArmorLocation(armorItem, layer)); - HumanoidModel *armor = layer == 2 ? armorParts2 : armorParts1; + SkullItem* skullItem = dynamic_cast(item); + HumanoidModel* armor = layer == 2 ? armorParts2 : armorParts1; - armor->head->visible = layer == 0; - armor->hair->visible = layer == 0; - armor->body->visible = layer == 1 || layer == 2; - armor->arm0->visible = layer == 1; - armor->arm1->visible = layer == 1; - armor->leg0->visible = layer == 2 || layer == 3; - armor->leg1->visible = layer == 2 || layer == 3; + armor->head->visible = layer == 0; + armor->hair->visible = layer == 0; + armor->body->visible = layer == 1 || layer == 2; + armor->arm0->visible = layer == 1; + armor->arm1->visible = layer == 1; + armor->leg0->visible = layer == 2 || layer == 3; + armor->leg1->visible = layer == 2 || layer == 3; - setArmor(armor); + setArmor(armor); if (armor != nullptr) armor->attackTime = model->attackTime; if (armor != nullptr) armor->riding = model->riding; if (armor != nullptr) armor->young = model->young; @@ -137,13 +139,58 @@ int PlayerRenderer::prepareArmor(shared_ptr _player, int layer, fl if (itemInstance->isEnchanted()) return 0xf; - return 1; - } - else if (dynamic_cast(item)) { - return -1; + return 1; } - } - return -1; + else if (dynamic_cast(item)) { + SkullItem* skullItem = dynamic_cast(item); + HumanoidModel* armor = armorParts1; + //auto t = new SkeletonHeadModel(0, 0, 64, 64, 1); + //armor->head->_init(); + //armor->head = t->head; + //armor->head->addHumanoidBox(-4, -8, -4, 8, 8, 8, 0.5); // Head + switch (itemInstance->getAuxValue()) + { + case SkullTileEntity::TYPE_WITHER: + bindTexture(&WITHER_SKELETON_LOCATION); + break; + case SkullTileEntity::TYPE_ZOMBIE: + bindTexture(&ZOMBIE_LOCATION); + break; + case SkullTileEntity::TYPE_CREEPER: + bindTexture(&CREEPER_LOCATION); + break; + case SkullTileEntity::TYPE_CHAR: + { + armor = armorParts3; + auto t = new SkeletonHeadModel(0, 0, 64, 64, 1); + armor->head = t->head; + bindTexture(&PlayerRenderer::DEFAULT_LOCATION); + break; + } + case SkullTileEntity::TYPE_SKELETON: + default: + bindTexture(&SKELETON_LOCATION); + break; + } + armor->head->visible = layer == 0; + + armor->hair->visible = false; + armor->body->visible = false; + armor->arm0->visible = false; + armor->arm1->visible = false; + armor->leg0->visible = false; + armor->leg1->visible = false; + setArmor(armor); + if (armor != nullptr) armor->attackTime = model->attackTime; + if (armor != nullptr) armor->riding = model->riding; + if (armor != nullptr) armor->young = model->young; + + return 1; + } + + } + return -1; + } void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, int layer, float a) @@ -153,11 +200,11 @@ void PlayerRenderer::prepareSecondPassArmor(shared_ptr _player, in shared_ptr itemInstance = player->inventory->getArmor(3 - layer); if (itemInstance != nullptr) { - Item *item = itemInstance->getItem(); - if (dynamic_cast(item)) + Item* item = itemInstance->getItem(); + if (dynamic_cast(item)) { - ArmorItem *armorItem = dynamic_cast(item); - bindTexture(HumanoidMobRenderer::getArmorLocation(static_cast(item), layer, true)); + ArmorItem* armorItem = dynamic_cast(item); + bindTexture(HumanoidMobRenderer::getArmorLocation(static_cast(item), layer, true)); float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : player->getBrightness(a); glColor3f(brightness, brightness, brightness); @@ -174,40 +221,40 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); - HumanoidModel *resModel = static_cast(model); + HumanoidModel* resModel = static_cast(model); - if(mob == nullptr) return; - if(mob->hasInvisiblePrivilege()) return; + if (mob == nullptr) return; + if (mob->hasInvisiblePrivilege()) return; if (mob != nullptr) { - Textures *textures = Minecraft::GetInstance()->textures; + Textures* textures = Minecraft::GetInstance()->textures; int skinId = mob->getPlayerDefaultSkin() - 1; int defaultSkin = mob->getPlayerDefaultSkin() + 35; if (slim[skinId] == true) { if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64) - resModel = static_cast(newHumanoidModelSlim); + resModel = static_cast(newHumanoidModelSlim); else - resModel = static_cast(humanoidModelSlim); + resModel = static_cast(humanoidModelSlim); } else { if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64) - resModel = static_cast(newHumanoidModel); + resModel = static_cast(newHumanoidModel); else - resModel = static_cast(humanoidModel); + resModel = static_cast(humanoidModel); } } else - resModel = static_cast(model); + resModel = static_cast(model); /*if (mob != nullptr && newHumanoidModelSlim != nullptr && (mob->getCustomSkin() >= 10 && mob->getCustomSkin() <= 18)) resModel = newHumanoidModelSlim; else if (mob != nullptr && newHumanoidModel != nullptr && (mob->getCustomSkin() >= 2 && mob->getCustomSkin() <= 9)) resModel = newHumanoidModel; else resModel = humanoidModel;*/ - shared_ptr item = mob->inventory->getSelected(); + shared_ptr item = mob->inventory->getSelected(); armorParts1->holdingRightHand = armorParts2->holdingRightHand = resModel->holdingRightHand = item != nullptr ? 1 : 0; @@ -227,11 +274,11 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double } } // 4J added, for 3rd person view of eating - if( item != nullptr && mob->getUseItemDuration() > 0 && item->getUseAnimation() == UseAnim_eat ) + if (item != nullptr && mob->getUseItemDuration() > 0 && item->getUseAnimation() == UseAnim_eat) { // These factors are largely lifted from ItemInHandRenderer to try and keep the 3rd person eating animation as similar as possible - float t = (mob->getUseItemDuration() - a + 1); - float swing = 1 - (t / item->getUseDuration()); + float t = (mob->getUseItemDuration() - a + 1); + float swing = 1 - (t / item->getUseDuration()); armorParts1->eating = armorParts2->eating = resModel->eating = true; armorParts1->eating_t = armorParts2->eating_t = resModel->eating_t = t; @@ -243,69 +290,69 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double } armorParts1->sneaking = armorParts2->sneaking = resModel->sneaking = mob->isSneaking(); - double yp = y - mob->heightOffset; - if (mob->isSneaking()) + double yp = y - mob->heightOffset; + if (mob->isSneaking()) { - yp -= 2 / 16.0f; - } + yp -= 2 / 16.0f; + } - if (mob->getAnimOverrideBitmask() & (1 << HumanoidModel::eAnim_SmallModel)) - { - if (mob->isRiding()) - { - std::shared_ptr ridingEntity = mob->riding; - if (ridingEntity != nullptr) // Safety check; - { - if (ridingEntity->instanceof(eTYPE_BOAT)) - { - yp += 0.25f; // reverts the change in Boat.cpp for smaller models. - } - } - } - } + if (mob->getAnimOverrideBitmask() & (1 << HumanoidModel::eAnim_SmallModel)) + { + if (mob->isRiding()) + { + std::shared_ptr ridingEntity = mob->riding; + if (ridingEntity != nullptr) // Safety check; + { + if (ridingEntity->instanceof(eTYPE_BOAT)) + { + yp += 0.25f; // reverts the change in Boat.cpp for smaller models. + } + } + } + } // Check if an idle animation is needed - if(mob->getAnimOverrideBitmask()&(1<getAnimOverrideBitmask() & (1 << HumanoidModel::eAnim_HasIdle)) { - if(mob->isIdle()) + if (mob->isIdle()) { - resModel->idle=true; - armorParts1->idle=true; - armorParts2->idle=true; + resModel->idle = true; + armorParts1->idle = true; + armorParts2->idle = true; } else { - resModel->idle=false; - armorParts1->idle=false; - armorParts2->idle=false; + resModel->idle = false; + armorParts1->idle = false; + armorParts2->idle = false; } } else { - resModel->idle=false; - armorParts1->idle=false; - armorParts2->idle=false; + resModel->idle = false; + armorParts1->idle = false; + armorParts2->idle = false; } // 4J-PB - any additional parts to turn on for this player (skin dependent) - vector *pAdditionalModelParts=mob->GetAdditionalModelParts(); + vector* pAdditionalModelParts = mob->GetAdditionalModelParts(); //turn them on - if(pAdditionalModelParts!=nullptr) + if (pAdditionalModelParts != nullptr) { - for(ModelPart *pModelPart : *pAdditionalModelParts) + for (ModelPart* pModelPart : *pAdditionalModelParts) { - pModelPart->visible=true; + pModelPart->visible = true; } } - LivingEntityRenderer::render(mob, x, yp, z, rot, a); + LivingEntityRenderer::render(mob, x, yp, z, rot, a); // turn them off again - if(pAdditionalModelParts && pAdditionalModelParts->size()!=0) + if (pAdditionalModelParts && pAdditionalModelParts->size() != 0) { - for(ModelPart *pModelPart : *pAdditionalModelParts) + for (ModelPart* pModelPart : *pAdditionalModelParts) { - pModelPart->visible=false; + pModelPart->visible = false; } } armorParts1->bowAndArrow = armorParts2->bowAndArrow = resModel->bowAndArrow = false; @@ -316,55 +363,55 @@ void PlayerRenderer::render(shared_ptr _mob, double x, double y, double void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) { float brightness = SharedConstants::TEXTURE_LIGHTING ? 1 : _mob->getBrightness(a); - glColor3f(brightness, brightness, brightness); + glColor3f(brightness, brightness, brightness); - LivingEntityRenderer::additionalRendering(_mob,a); + LivingEntityRenderer::additionalRendering(_mob, a); LivingEntityRenderer::renderArrows(_mob, a); // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); - HumanoidModel *resModel = static_cast(model); + HumanoidModel* resModel = static_cast(model); if (mob != nullptr) { - Textures *textures = Minecraft::GetInstance()->textures; + Textures* textures = Minecraft::GetInstance()->textures; int skinId = mob->getPlayerDefaultSkin() - 1; int defaultSkin = mob->getPlayerDefaultSkin() + 35; if (slim[skinId] == true) { if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64) - resModel = static_cast(newHumanoidModelSlim); + resModel = static_cast(newHumanoidModelSlim); else - resModel = static_cast(humanoidModelSlim); + resModel = static_cast(humanoidModelSlim); } else { if (textures->getHeight(mob->customTextureUrl, defaultSkin) == 64) - resModel = static_cast(newHumanoidModel); + resModel = static_cast(newHumanoidModel); else - resModel = static_cast(humanoidModel); + resModel = static_cast(humanoidModel); } } else - resModel = static_cast(model); + resModel = static_cast(model); /*if (mob != nullptr && newHumanoidModelSlim != nullptr && (mob->getCustomSkin() >= 10 && mob->getCustomSkin() <= 18)) resModel = newHumanoidModelSlim; else if (mob != nullptr && newHumanoidModel != nullptr && (mob->getCustomSkin() >= 2 && mob->getCustomSkin() <= 9)) resModel = newHumanoidModel; else resModel = humanoidModel;*/ - shared_ptr headGear = mob->inventory->getArmor(3); - if (headGear != nullptr) + shared_ptr headGear = mob->inventory->getArmor(3); + if (headGear != nullptr) { // don't render the pumpkin for the skins - unsigned int uiAnimOverrideBitmask = mob->getSkinAnimOverrideBitmask( mob->getCustomSkin()); + unsigned int uiAnimOverrideBitmask = mob->getSkinAnimOverrideBitmask(mob->getCustomSkin()); - if((uiAnimOverrideBitmask&(1<head->translateTo(1 / 16.0f); - if(headGear->getItem()->id < 256) + if (headGear->getItem()->id < 256) { if (TileRenderer::canRender(Tile::tiles[headGear->id]->getRenderShape())) { @@ -376,7 +423,7 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) entityRenderDispatcher->itemInHandRenderer->renderItem(mob, headGear, 0); } - else if (headGear->getItem()->id == Item::skull_Id) + /*else if (headGear->getItem()->id == Item::skull_Id) { float s = 17 / 16.0f; glScalef(s, -s, -s); @@ -387,91 +434,91 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) extra = headGear->getTag()->getString(L"SkullOwner"); } SkullTileRenderer::instance->renderSkull(-0.5f, 0, -0.5f, Facing::UP, 180, headGear->getAuxValue(), extra); - } + }*/ //SkullTileRenderer::instance->renderSkull(-0.5f, 0, -0.5f, Facing::UP, 180, headGear->getAuxValue(), extra); glPopMatrix(); } - } + } // need to add a custom texture for deadmau5 - if (mob != nullptr && app.isXuidDeadmau5( mob->getXuid() ) && bindTexture(mob->customTextureUrl, L"" )) + if (mob != nullptr && app.isXuidDeadmau5(mob->getXuid()) && bindTexture(mob->customTextureUrl, L"")) { - for (int i = 0; i < 2; i++) + for (int i = 0; i < 2; i++) { - float yr = (mob->yRotO + (mob->yRot - mob->yRotO) * a) - (mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a); - float xr = mob->xRotO + (mob->xRot - mob->xRotO) * a; - glPushMatrix(); - glRotatef(yr, 0, 1, 0); - glRotatef(xr, 1, 0, 0); - glTranslatef((6 / 16.0f) * (i * 2 - 1), 0, 0); - glTranslatef(0, -6 / 16.0f, 0); - glRotatef(-xr, 1, 0, 0); - glRotatef(-yr, 0, 1, 0); + float yr = (mob->yRotO + (mob->yRot - mob->yRotO) * a) - (mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a); + float xr = mob->xRotO + (mob->xRot - mob->xRotO) * a; + glPushMatrix(); + glRotatef(yr, 0, 1, 0); + glRotatef(xr, 1, 0, 0); + glTranslatef((6 / 16.0f) * (i * 2 - 1), 0, 0); + glTranslatef(0, -6 / 16.0f, 0); + glRotatef(-xr, 1, 0, 0); + glRotatef(-yr, 0, 1, 0); - float s = 8 / 6.0f; - glScalef(s, s, s); - resModel->renderEars(1 / 16.0f,true); - glPopMatrix(); - } - } + float s = 8 / 6.0f; + glScalef(s, s, s); + resModel->renderEars(1 / 16.0f, true); + glPopMatrix(); + } + } // 4J: removed /*boolean loaded = mob->getCloakTexture()->isLoaded(); - boolean b1 = !mob->isInvisible(); - boolean b2 = !mob->isCapeHidden();*/ + boolean b1 = !mob->isInvisible(); + boolean b2 = !mob->isCapeHidden();*/ if (bindTexture(mob->customTextureUrl2, L"") && !mob->isInvisible()) { - glPushMatrix(); - glTranslatef(0, 0, 2 / 16.0f); + glPushMatrix(); + glTranslatef(0, 0, 2 / 16.0f); - double xd = (mob->xCloakO + (mob->xCloak - mob->xCloakO) * a) - (mob->xo + (mob->x - mob->xo) * a); - double yd = (mob->yCloakO + (mob->yCloak - mob->yCloakO) * a) - (mob->yo + (mob->y - mob->yo) * a); - double zd = (mob->zCloakO + (mob->zCloak - mob->zCloakO) * a) - (mob->zo + (mob->z - mob->zo) * a); + double xd = (mob->xCloakO + (mob->xCloak - mob->xCloakO) * a) - (mob->xo + (mob->x - mob->xo) * a); + double yd = (mob->yCloakO + (mob->yCloak - mob->yCloakO) * a) - (mob->yo + (mob->y - mob->yo) * a); + double zd = (mob->zCloakO + (mob->zCloak - mob->zCloakO) * a) - (mob->zo + (mob->z - mob->zo) * a); - float yr = mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a; + float yr = mob->yBodyRotO + (mob->yBodyRot - mob->yBodyRotO) * a; - double xa = Mth::sin(yr * PI / 180); - double za = -Mth::cos(yr * PI / 180); + double xa = Mth::sin(yr * PI / 180); + double za = -Mth::cos(yr * PI / 180); - float flap = static_cast(yd) * 10; - if (flap < -6) flap = -6; - if (flap > 32) flap = 32; - float lean = static_cast(xd * xa + zd * za) * 100; - float lean2 = static_cast(xd * za - zd * xa) * 100; - if (lean < 0) lean = 0; + float flap = static_cast(yd) * 10; + if (flap < -6) flap = -6; + if (flap > 32) flap = 32; + float lean = static_cast(xd * xa + zd * za) * 100; + float lean2 = static_cast(xd * za - zd * xa) * 100; + if (lean < 0) lean = 0; - float pow = mob->oBob + (mob->bob - mob->oBob) * a; + float pow = mob->oBob + (mob->bob - mob->oBob) * a; - flap += sin((mob->walkDistO + (mob->walkDist - mob->walkDistO) * a) * 6) * 32 * pow; - if (mob->isSneaking()) + flap += sin((mob->walkDistO + (mob->walkDist - mob->walkDistO) * a) * 6) * 32 * pow; + if (mob->isSneaking()) { - flap += 25; - } + flap += 25; + } // 4J Stu - Fix for sprint-flying causing the cape to rotate up by 180 degrees or more float xRot = 6.0f + lean / 2 + flap; - if(xRot > 64.0f) xRot = 64.0f; + if (xRot > 64.0f) xRot = 64.0f; - glRotatef(xRot, 1, 0, 0); - glRotatef(lean2 / 2, 0, 0, 1); - glRotatef(-lean2 / 2, 0, 1, 0); - glRotatef(180, 0, 1, 0); - resModel->renderCloak(1 / 16.0f,true); - glPopMatrix(); - } + glRotatef(xRot, 1, 0, 0); + glRotatef(lean2 / 2, 0, 0, 1); + glRotatef(-lean2 / 2, 0, 1, 0); + glRotatef(180, 0, 1, 0); + resModel->renderCloak(1 / 16.0f, true); + glPopMatrix(); + } - shared_ptr item = mob->inventory->getSelected(); + shared_ptr item = mob->inventory->getSelected(); - if (item != nullptr) + if (item != nullptr) { - glPushMatrix(); + glPushMatrix(); resModel->arm0->translateTo(1 / 16.0f); - glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); + glTranslatef(-1 / 16.0f, 7 / 16.0f, 1 / 16.0f); - if (mob->fishing != nullptr) + if (mob->fishing != nullptr) { - item = std::make_shared(Item::stick); - } + item = std::make_shared(Item::stick); + } UseAnim anim = UseAnim_none;//null; if (mob->getUseItemDuration() > 0) @@ -479,14 +526,14 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) anim = item->getUseAnimation(); } - if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) + if (item->id < 256 && TileRenderer::canRender(Tile::tiles[item->id]->getRenderShape())) { - 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); + 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) { @@ -522,19 +569,19 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) } 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); - } + 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); + } if (item->getItem()->hasMultipleSpriteLayers()) { for (int layer = 0; layer <= 1; layer++) { - int col = item->getItem()->getColor(item,layer); + int col = item->getItem()->getColor(item, layer); float red = ((col >> 16) & 0xff) / 255.0f; float g = ((col >> 8) & 0xff) / 255.0f; float b = ((col) & 0xff) / 255.0f; @@ -546,42 +593,42 @@ void PlayerRenderer::additionalRendering(shared_ptr _mob, float a) else { int col = item->getItem()->getColor(item, 0); - float red = ((col >> 16) & 0xff) / 255.0f; - float g = ((col >> 8) & 0xff) / 255.0f; - float b = ((col) & 0xff) / 255.0f; + float red = ((col >> 16) & 0xff) / 255.0f; + float g = ((col >> 8) & 0xff) / 255.0f; + float b = ((col) & 0xff) / 255.0f; - glColor4f(red, g, b, 1); + glColor4f(red, g, b, 1); this->entityRenderDispatcher->itemInHandRenderer->renderItem(mob, item, 0); } - glPopMatrix(); + glPopMatrix(); } } -void PlayerRenderer::renderNameTags(shared_ptr player, double x, double y, double z, const wstring &msg, float scale, double dist) +void PlayerRenderer::renderNameTags(shared_ptr player, double x, double y, double z, const wstring& msg, float scale, double dist) { #if 0 - if (dist < 10 * 10) + if (dist < 10 * 10) { - Scoreboard *scoreboard = player->getScoreboard(); - Objective *objective = scoreboard->getDisplayObjective(Scoreboard::DISPLAY_SLOT_BELOW_NAME); + Scoreboard* scoreboard = player->getScoreboard(); + Objective* objective = scoreboard->getDisplayObjective(Scoreboard::DISPLAY_SLOT_BELOW_NAME); - if (objective != nullptr) + if (objective != nullptr) { - Score *score = scoreboard->getPlayerScore(player->getAName(), objective); + Score* score = scoreboard->getPlayerScore(player->getAName(), objective); - if (player->isSleeping()) + if (player->isSleeping()) { - renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y - 1.5f, z, 64); - } + renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y - 1.5f, z, 64); + } else { - renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y, z, 64); - } + renderNameTag(player, score->getScore() + " " + objective->getDisplayName(), x, y, z, 64); + } - y += getFont()->lineHeight * 1.15f * scale; - } - } + y += getFont()->lineHeight * 1.15f * scale; + } + } #endif shared_ptr pPlayer = dynamic_pointer_cast(player); @@ -599,53 +646,53 @@ void PlayerRenderer::renderNameTags(shared_ptr player, double x, d void PlayerRenderer::scale(shared_ptr player, float a) { - float s = 15 / 16.0f; - glScalef(s, s, s); + float s = 15 / 16.0f; + glScalef(s, s, s); } void PlayerRenderer::renderHand() { shared_ptr player = dynamic_pointer_cast(Minecraft::GetInstance()->player); - HumanoidModel *resModel = static_cast(model); + HumanoidModel* resModel = static_cast(model); if (player != nullptr) { - Textures *textures = Minecraft::GetInstance()->textures; + Textures* textures = Minecraft::GetInstance()->textures; int skinId = player->getPlayerDefaultSkin() - 1; int defaultSkin = player->getPlayerDefaultSkin() + 35; if (slim[skinId] == true) { if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64) - resModel = static_cast(newHumanoidModelSlim); + resModel = static_cast(newHumanoidModelSlim); else - resModel = static_cast(humanoidModelSlim); + resModel = static_cast(humanoidModelSlim); } else { if (textures->getHeight(player->customTextureUrl, defaultSkin) == 64) - resModel = static_cast(newHumanoidModel); + resModel = static_cast(newHumanoidModel); else - resModel = static_cast(humanoidModel); + resModel = static_cast(humanoidModel); } } else - resModel = static_cast(model); + resModel = static_cast(model); /*if (player != nullptr && newHumanoidModelSlim != nullptr && (player->getCustomSkin() >= 10 && player->getCustomSkin() <= 18)) resModel = newHumanoidModelSlim; else if (player != nullptr && newHumanoidModel != nullptr && (player->getCustomSkin() >= 2 && player->getCustomSkin() <= 9)) resModel = newHumanoidModel; else resModel = humanoidModel;*/ float brightness = 1; - glColor3f(brightness, brightness, brightness); + glColor3f(brightness, brightness, brightness); resModel->m_uiAnimOverrideBitmask = player->getAnimOverrideBitmask(); armorParts1->eating = armorParts2->eating = resModel->eating = resModel->idle = false; resModel->attackTime = 0; resModel->setupAnim(0, 0, 0, 0, 0, 1 / 16.0f, Minecraft::GetInstance()->player); // 4J-PB - does this skin have its arm0 disabled? (Dalek, etc) - if((resModel->m_uiAnimOverrideBitmask&(1<arm0->render(1 / 16.0f,true); + if ((resModel->m_uiAnimOverrideBitmask & (1 << HumanoidModel::eAnim_DisableRenderArm0)) == 0) + resModel->arm0->render(1 / 16.0f, true); //Render custom skin boxes on viewmodel - Botch vector* additionalModelParts = Minecraft::GetInstance()->player->GetAdditionalModelParts(); @@ -673,19 +720,19 @@ void PlayerRenderer::setupPosition(shared_ptr _mob, double x, doub // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); - if (mob->isAlive() && mob->isSleeping()) + if (mob->isAlive() && mob->isSleeping()) { - LivingEntityRenderer::setupPosition(mob, x + mob->bedOffsetX, y + mob->bedOffsetY, z + mob->bedOffsetZ); + LivingEntityRenderer::setupPosition(mob, x + mob->bedOffsetX, y + mob->bedOffsetY, z + mob->bedOffsetZ); - } + } else { - if(mob->isRiding() && (mob->getAnimOverrideBitmask()&(1<isRiding() && (mob->getAnimOverrideBitmask() & (1 << HumanoidModel::eAnim_SmallModel)) != 0) { y += 0.5f; } - LivingEntityRenderer::setupPosition(mob, x, y, z); - } + LivingEntityRenderer::setupPosition(mob, x, y, z); + } } void PlayerRenderer::setupRotations(shared_ptr _mob, float bob, float bodyRot, float a) @@ -693,27 +740,27 @@ void PlayerRenderer::setupRotations(shared_ptr _mob, float bob, fl // 4J - dynamic cast required because we aren't using templates/generics in our version shared_ptr mob = dynamic_pointer_cast(_mob); - if (mob->isAlive() && mob->isSleeping()) + if (mob->isAlive() && mob->isSleeping()) { - glRotatef(mob->getSleepRotation(), 0, 1, 0); - glRotatef(getFlipDegrees(mob), 0, 0, 1); - glRotatef(270, 0, 1, 0); - } + glRotatef(mob->getSleepRotation(), 0, 1, 0); + glRotatef(getFlipDegrees(mob), 0, 0, 1); + glRotatef(270, 0, 1, 0); + } else { - LivingEntityRenderer::setupRotations(mob, bob, bodyRot, a); - } + LivingEntityRenderer::setupRotations(mob, bob, bodyRot, a); + } } // 4J Added override to stop rendering shadow if player is invisible void PlayerRenderer::renderShadow(shared_ptr e, double x, double y, double z, float pow, float a) { - if(app.GetGameHostOption(eGameHostOption_HostCanBeInvisible) > 0) + if (app.GetGameHostOption(eGameHostOption_HostCanBeInvisible) > 0) { shared_ptr player = dynamic_pointer_cast(e); - if(player != nullptr && player->hasInvisiblePrivilege()) return; + if (player != nullptr && player->hasInvisiblePrivilege()) return; } - EntityRenderer::renderShadow(e,x,y,z,pow,a); + EntityRenderer::renderShadow(e, x, y, z, pow, a); } // 4J Added override @@ -723,7 +770,7 @@ void PlayerRenderer::bindTexture(shared_ptr entity) bindTexture(player->customTextureUrl, player->getTexture()); } -ResourceLocation *PlayerRenderer::getTextureLocation(shared_ptr entity) +ResourceLocation* PlayerRenderer::getTextureLocation(shared_ptr entity) { shared_ptr player = dynamic_pointer_cast(entity); return new ResourceLocation(static_cast<_TEXTURE_NAME>(player->getTexture())); diff --git a/Minecraft.Client/PlayerRenderer.h b/Minecraft.Client/PlayerRenderer.h index c2d2c12c..8accdc7f 100644 --- a/Minecraft.Client/PlayerRenderer.h +++ b/Minecraft.Client/PlayerRenderer.h @@ -21,8 +21,9 @@ private: HumanoidModel *armorParts1; HumanoidModel *armorParts2; HumanoidModel *armorParts3; + HumanoidModel *armorParts4; bool defaultSlimHands; -public: + static ResourceLocation SKELETON_LOCATION; static ResourceLocation WITHER_SKELETON_LOCATION; static ResourceLocation ZOMBIE_LOCATION;