diff --git a/src/game/client/components/chat.cpp b/src/game/client/components/chat.cpp index 5c2994f71..3ceb9078b 100644 --- a/src/game/client/components/chat.cpp +++ b/src/game/client/components/chat.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -640,6 +641,12 @@ void CChat::AddLine(const char *pLine, int ClientID, int Mode, int TargetID) pCurLine->m_Mode = Mode; pCurLine->m_NameColor = -2; + if(ClientID >= 0) + { + pCurLine->m_RenderInfo = m_pClient->m_aClients[(Mode == CHAT_WHISPER && ClientID == m_pClient->m_LocalClientID) ? TargetID : ClientID].m_RenderInfo; + pCurLine->m_RenderInfo.m_Size = 9.f; + } + // check for highlighted name Highlighted = false; // do not highlight our own messages, whispers and system messages @@ -1284,6 +1291,14 @@ void CChat::OnRender() TextRender()->TextAdvance(&s_ChatCursor, ClientIDWidth); TextRender()->TextColor(TextColorName); TextRender()->TextSecondaryColor(ShadowColor); + if(Config()->m_ClShowSkinChat) + { + static CAnimState s_State; + s_State.Set(&g_pData->m_aAnimations[ANIM_BASE], 1.0f); + s_State.Add(&g_pData->m_aAnimations[ANIM_IDLE], 0, 1.0f); + RenderTools()->RenderTee(&s_State, &pLine->m_RenderInfo, EMOTE_NORMAL, vec2(1.f, 0.f), vec2(s_ChatCursor.AdvancePosition().x + FontSize / 3 * 2 - 1.f, y + FontSize / 3 * 2 + 1.f), Blend); + TextRender()->TextAdvance(&s_ChatCursor, FontSize + 1.f); + } TextRender()->TextDeferred(&s_ChatCursor, pLine->m_aName, -1); TextRender()->TextDeferred(&s_ChatCursor, ": ", -1); NumNameGlyphs = s_ChatCursor.GlyphCount(); diff --git a/src/game/client/components/chat.h b/src/game/client/components/chat.h index 22b689fd8..f20458494 100644 --- a/src/game/client/components/chat.h +++ b/src/game/client/components/chat.h @@ -24,6 +24,7 @@ class CChat : public CComponent { int64 m_Time; vec2 m_Size; + CTeeRenderInfo m_RenderInfo; int m_ClientID; int m_TargetID; int m_Mode; diff --git a/src/game/client/render.cpp b/src/game/client/render.cpp index 693ebcd4f..fba423254 100644 --- a/src/game/client/render.cpp +++ b/src/game/client/render.cpp @@ -75,7 +75,7 @@ void CRenderTools::RenderCursor(float CenterX, float CenterY, float Size) Graphics()->WrapNormal(); } -void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos) +void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha) { vec2 Direction = Dir; vec2 Position = Pos; @@ -85,17 +85,17 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int // second pass we draw the filling for(int p = 0; p < 2; p++) { - bool OutLine = p==0; + bool OutLine = p == 0; for(int f = 0; f < 2; f++) { - float AnimScale = pInfo->m_Size * 1.0f/64.0f; + float AnimScale = pInfo->m_Size * 1.0f / 64.0f; float BaseSize = pInfo->m_Size; if(f == 1) { - vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y)*AnimScale; + vec2 BodyPos = Position + vec2(pAnim->GetBody()->m_X, pAnim->GetBody()->m_Y) * AnimScale; IGraphics::CQuadItem BodyItem(BodyPos.x, BodyPos.y, BaseSize, BaseSize); - IGraphics::CQuadItem BotItem(BodyPos.x+(2.f/3.f)*AnimScale, BodyPos.y+(-16+2.f/3.f)*AnimScale, BaseSize, BaseSize); // x+0.66, y+0.66 to correct some rendering bug + IGraphics::CQuadItem BotItem(BodyPos.x + (2.f / 3.f) * AnimScale, BodyPos.y + (-16 + 2.f / 3.f) * AnimScale, BaseSize, BaseSize); // x+0.66, y+0.66 to correct some rendering bug IGraphics::CQuadItem Item; // draw bot visuals (background) @@ -103,7 +103,7 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int { Graphics()->TextureSet(pInfo->m_BotTexture); Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); + Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); SelectSprite(SPRITE_TEE_BOT_BACKGROUND, 0, 0, 0); Item = BotItem; Graphics()->QuadsDraw(&Item, 1); @@ -115,11 +115,11 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int { Graphics()->TextureSet(pInfo->m_BotTexture); Graphics()->QuadsBegin(); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); + Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); SelectSprite(SPRITE_TEE_BOT_FOREGROUND, 0, 0, 0); Item = BotItem; Graphics()->QuadsDraw(&Item, 1); - Graphics()->SetColor(pInfo->m_BotColor.r, pInfo->m_BotColor.g, pInfo->m_BotColor.b, pInfo->m_BotColor.a); + Graphics()->SetColor(pInfo->m_BotColor.r * Alpha, pInfo->m_BotColor.g * Alpha, pInfo->m_BotColor.b * Alpha, Alpha); SelectSprite(SPRITE_TEE_BOT_GLOW, 0, 0, 0); Item = BotItem; Graphics()->QuadsDraw(&Item, 1); @@ -131,9 +131,9 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int { Graphics()->TextureSet(pInfo->m_aTextures[SKINPART_DECORATION]); Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); - Graphics()->SetColor(pInfo->m_aColors[SKINPART_DECORATION].r, pInfo->m_aColors[SKINPART_DECORATION].g, pInfo->m_aColors[SKINPART_DECORATION].b, pInfo->m_aColors[SKINPART_DECORATION].a); - SelectSprite(OutLine?SPRITE_TEE_DECORATION_OUTLINE:SPRITE_TEE_DECORATION, 0, 0, 0); + Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); + Graphics()->SetColor(pInfo->m_aColors[SKINPART_DECORATION].r * Alpha, pInfo->m_aColors[SKINPART_DECORATION].g * Alpha, pInfo->m_aColors[SKINPART_DECORATION].b * Alpha, Alpha); + SelectSprite(OutLine ? SPRITE_TEE_DECORATION_OUTLINE : SPRITE_TEE_DECORATION, 0, 0, 0); Item = BodyItem; Graphics()->QuadsDraw(&Item, 1); Graphics()->QuadsEnd(); @@ -142,15 +142,15 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int // draw body (behind marking) Graphics()->TextureSet(pInfo->m_aTextures[SKINPART_BODY]); Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); + Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); if(OutLine) { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); + Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); SelectSprite(SPRITE_TEE_BODY_OUTLINE, 0, 0, 0); } else { - Graphics()->SetColor(pInfo->m_aColors[SKINPART_BODY].r, pInfo->m_aColors[SKINPART_BODY].g, pInfo->m_aColors[SKINPART_BODY].b, pInfo->m_aColors[SKINPART_BODY].a); + Graphics()->SetColor(pInfo->m_aColors[SKINPART_BODY].r * Alpha, pInfo->m_aColors[SKINPART_BODY].g * Alpha, pInfo->m_aColors[SKINPART_BODY].b * Alpha, Alpha); SelectSprite(SPRITE_TEE_BODY, 0, 0, 0); } Item = BodyItem; @@ -162,9 +162,9 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int { Graphics()->TextureSet(pInfo->m_aTextures[SKINPART_MARKING]); Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); - Graphics()->SetColor(pInfo->m_aColors[SKINPART_MARKING].r*pInfo->m_aColors[SKINPART_MARKING].a, pInfo->m_aColors[SKINPART_MARKING].g*pInfo->m_aColors[SKINPART_MARKING].a, - pInfo->m_aColors[SKINPART_MARKING].b*pInfo->m_aColors[SKINPART_MARKING].a, pInfo->m_aColors[SKINPART_MARKING].a); + Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); + Graphics()->SetColor(pInfo->m_aColors[SKINPART_MARKING].r * pInfo->m_aColors[SKINPART_MARKING].a * Alpha, pInfo->m_aColors[SKINPART_MARKING].g * pInfo->m_aColors[SKINPART_MARKING].a * Alpha, + pInfo->m_aColors[SKINPART_MARKING].b * pInfo->m_aColors[SKINPART_MARKING].a * Alpha, pInfo->m_aColors[SKINPART_MARKING].a * Alpha); SelectSprite(SPRITE_TEE_MARKING, 0, 0, 0); Item = BodyItem; Graphics()->QuadsDraw(&Item, 1); @@ -176,11 +176,11 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int { Graphics()->TextureSet(pInfo->m_aTextures[SKINPART_BODY]); Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); + Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); + Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); for(int t = 0; t < 2; t++) { - SelectSprite(t==0?SPRITE_TEE_BODY_SHADOW:SPRITE_TEE_BODY_UPPER_OUTLINE, 0, 0, 0); + SelectSprite(t == 0 ? SPRITE_TEE_BODY_SHADOW : SPRITE_TEE_BODY_UPPER_OUTLINE, 0, 0, 0); Item = BodyItem; Graphics()->QuadsDraw(&Item, 1); } @@ -190,50 +190,50 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int // draw eyes Graphics()->TextureSet(pInfo->m_aTextures[SKINPART_EYES]); Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi*2); + Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); if(IsBot) { - Graphics()->SetColor(pInfo->m_BotColor.r, pInfo->m_BotColor.g, pInfo->m_BotColor.b, pInfo->m_BotColor.a); + Graphics()->SetColor(pInfo->m_BotColor.r * Alpha, pInfo->m_BotColor.g * Alpha, pInfo->m_BotColor.b * Alpha, Alpha); Emote = EMOTE_SURPRISE; } else - Graphics()->SetColor(pInfo->m_aColors[SKINPART_EYES].r, pInfo->m_aColors[SKINPART_EYES].g, pInfo->m_aColors[SKINPART_EYES].b, pInfo->m_aColors[SKINPART_EYES].a); + Graphics()->SetColor(pInfo->m_aColors[SKINPART_EYES].r * Alpha, pInfo->m_aColors[SKINPART_EYES].g * Alpha, pInfo->m_aColors[SKINPART_EYES].b * Alpha, Alpha); if(p == 1) { - switch (Emote) + switch(Emote) { - case EMOTE_PAIN: - SelectSprite(SPRITE_TEE_EYES_PAIN, 0, 0, 0); - break; - case EMOTE_HAPPY: - SelectSprite(SPRITE_TEE_EYES_HAPPY, 0, 0, 0); - break; - case EMOTE_SURPRISE: - SelectSprite(SPRITE_TEE_EYES_SURPRISE, 0, 0, 0); - break; - case EMOTE_ANGRY: - SelectSprite(SPRITE_TEE_EYES_ANGRY, 0, 0, 0); - break; - default: - SelectSprite(SPRITE_TEE_EYES_NORMAL, 0, 0, 0); - break; + case EMOTE_PAIN: + SelectSprite(SPRITE_TEE_EYES_PAIN, 0, 0, 0); + break; + case EMOTE_HAPPY: + SelectSprite(SPRITE_TEE_EYES_HAPPY, 0, 0, 0); + break; + case EMOTE_SURPRISE: + SelectSprite(SPRITE_TEE_EYES_SURPRISE, 0, 0, 0); + break; + case EMOTE_ANGRY: + SelectSprite(SPRITE_TEE_EYES_ANGRY, 0, 0, 0); + break; + default: + SelectSprite(SPRITE_TEE_EYES_NORMAL, 0, 0, 0); + break; } - float EyeScale = BaseSize*0.60f; - float h = Emote == EMOTE_BLINK ? BaseSize*0.15f/2.0f : EyeScale/2.0f; - vec2 Offset = vec2(Direction.x*0.125f, -0.05f+Direction.y*0.10f)*BaseSize; - IGraphics::CQuadItem QuadItem(BodyPos.x+Offset.x, BodyPos.y+Offset.y, EyeScale, h); + float EyeScale = BaseSize * 0.60f; + float h = Emote == EMOTE_BLINK ? BaseSize * 0.15f / 2.0f : EyeScale / 2.0f; + vec2 Offset = vec2(Direction.x * 0.125f, -0.05f + Direction.y * 0.10f) * BaseSize; + IGraphics::CQuadItem QuadItem(BodyPos.x + Offset.x, BodyPos.y + Offset.y, EyeScale, h); Graphics()->QuadsDraw(&QuadItem, 1); } Graphics()->QuadsEnd(); - + // draw xmas hat if(!OutLine && pInfo->m_HatTexture.IsValid()) { Graphics()->TextureSet(pInfo->m_HatTexture); Graphics()->QuadsBegin(); - Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle*pi * 2); - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); + Graphics()->QuadsSetRotation(pAnim->GetBody()->m_Angle * pi * 2); + Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); int Flag = Direction.x < 0.0f ? SPRITE_FLAG_FLIP_X : 0; switch(pInfo->m_HatSpriteIndex) { @@ -260,14 +260,14 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Graphics()->QuadsBegin(); CAnimKeyframe *pFoot = f ? pAnim->GetFrontFoot() : pAnim->GetBackFoot(); - float w = BaseSize/2.1f; + float w = BaseSize / 2.1f; float h = w; - Graphics()->QuadsSetRotation(pFoot->m_Angle*pi*2); + Graphics()->QuadsSetRotation(pFoot->m_Angle * pi * 2); if(OutLine) { - Graphics()->SetColor(1.0f, 1.0f, 1.0f, 1.0f); + Graphics()->SetColor(1.0f, 1.0f, 1.0f, Alpha); SelectSprite(SPRITE_TEE_FOOT_OUTLINE, 0, 0, 0); } else @@ -276,11 +276,11 @@ void CRenderTools::RenderTee(CAnimState *pAnim, const CTeeRenderInfo *pInfo, int float cs = 1.0f; // color scale if(Indicate) cs = 0.5f; - Graphics()->SetColor(pInfo->m_aColors[SKINPART_FEET].r*cs, pInfo->m_aColors[SKINPART_FEET].g*cs, pInfo->m_aColors[SKINPART_FEET].b*cs, pInfo->m_aColors[SKINPART_FEET].a); + Graphics()->SetColor(pInfo->m_aColors[SKINPART_FEET].r * cs * Alpha, pInfo->m_aColors[SKINPART_FEET].g * cs * Alpha, pInfo->m_aColors[SKINPART_FEET].b * cs * Alpha, pInfo->m_aColors[SKINPART_FEET].a * Alpha); SelectSprite(SPRITE_TEE_FOOT, 0, 0, 0); } - IGraphics::CQuadItem QuadItem(Position.x+pFoot->m_X*AnimScale, Position.y+pFoot->m_Y*AnimScale, w, h); + IGraphics::CQuadItem QuadItem(Position.x + pFoot->m_X * AnimScale, Position.y + pFoot->m_Y * AnimScale, w, h); Graphics()->QuadsDraw(&QuadItem, 1); Graphics()->QuadsEnd(); } diff --git a/src/game/client/render.h b/src/game/client/render.h index 0e16a4e88..e9216f9b5 100644 --- a/src/game/client/render.h +++ b/src/game/client/render.h @@ -62,7 +62,7 @@ class CRenderTools void RenderCursor(vec2 Center, float Size) { RenderCursor(Center.x, Center.y, Size); } // object render methods - void RenderTee(class CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos); + void RenderTee(class CAnimState *pAnim, const CTeeRenderInfo *pInfo, int Emote, vec2 Dir, vec2 Pos, float Alpha = 1.0f); void RenderTeeHand(const CTeeRenderInfo *pInfo, vec2 CenterPos, vec2 Dir, float AngleOffset, vec2 PostRotOffset); // map render methods (render_map.cpp) diff --git a/src/game/variables.h b/src/game/variables.h index 78f24f20e..0ec73c90a 100644 --- a/src/game/variables.h +++ b/src/game/variables.h @@ -21,6 +21,7 @@ MACRO_CONFIG_INT(ClFilterchat, cl_filterchat, 0, 0, 2, CFGFLAG_CLIENT|CFGFLAG_SA MACRO_CONFIG_INT(ClDisableWhisper, cl_disable_whisper, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Disable completely the whisper feature.") MACRO_CONFIG_INT(ClShowsocial, cl_showsocial, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show social data like names, clans, chat etc.") MACRO_CONFIG_INT(ClShowfps, cl_showfps, 0, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show ingame FPS counter") +MACRO_CONFIG_INT(ClShowSkinChat, cl_show_skin_chat, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show player skin in the chat line") MACRO_CONFIG_INT(ClAirjumpindicator, cl_airjumpindicator, 1, 0, 1, CFGFLAG_CLIENT|CFGFLAG_SAVE, "Show double jump indicator")