diff --git a/include/ui/game_screen.hpp b/include/ui/game_screen.hpp index f22ba4da..a6ebf9c0 100644 --- a/include/ui/game_screen.hpp +++ b/include/ui/game_screen.hpp @@ -621,6 +621,9 @@ private: float resurrectFlashTimer_ = 0.0f; static constexpr float kResurrectFlashDuration = 3.0f; bool ghostStateCallbackSet_ = false; + bool ghostOpacityStateKnown_ = false; + bool ghostOpacityLastState_ = false; + uint32_t ghostOpacityLastInstanceId_ = 0; void renderResurrectFlash(); // Zone discovery text ("Entering: ") diff --git a/src/ui/game_screen.cpp b/src/ui/game_screen.cpp index c9be2a9a..98b1df28 100644 --- a/src/ui/game_screen.cpp +++ b/src/ui/game_screen.cpp @@ -848,6 +848,20 @@ void GameScreen::render(game::GameHandler& gameHandler) { renderer->setInCombat(gameHandler.isInCombat() && !gameHandler.isPlayerDead() && !gameHandler.isPlayerGhost()); + if (auto* cr = renderer->getCharacterRenderer()) { + uint32_t charInstId = renderer->getCharacterInstanceId(); + if (charInstId != 0) { + const bool isGhost = gameHandler.isPlayerGhost(); + if (!ghostOpacityStateKnown_ || + ghostOpacityLastState_ != isGhost || + ghostOpacityLastInstanceId_ != charInstId) { + cr->setInstanceOpacity(charInstId, isGhost ? 0.5f : 1.0f); + ghostOpacityStateKnown_ = true; + ghostOpacityLastState_ = isGhost; + ghostOpacityLastInstanceId_ = charInstId; + } + } + } static glm::vec3 targetGLPos; if (gameHandler.hasTarget()) { auto target = gameHandler.getTarget();