diff --git a/src/engine/shared/config_variables.h b/src/engine/shared/config_variables.h index cdf5b1880..28b94ecfc 100644 --- a/src/engine/shared/config_variables.h +++ b/src/engine/shared/config_variables.h @@ -318,7 +318,8 @@ MACRO_CONFIG_INT(ClRaceSaveGhost, cl_race_save_ghost, 1, 0, 1, CFGFLAG_CLIENT | MACRO_CONFIG_INT(ClDDRaceHud, cl_ddrace_hud, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable DDRace HUD") MACRO_CONFIG_INT(ClDDRaceScoreBoard, cl_ddrace_scoreboard, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Enable DDRace Scoreboard") -MACRO_CONFIG_INT(ClShowFreezeBars, cl_show_freeze_bars, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Show a freeze bar under frozen players to indicate the thaw time") +MACRO_CONFIG_INT(ClShowJumpsIndicator, cl_show_jumps_indicator, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Whether to show in the HUD how many jumps you have and have used") +MACRO_CONFIG_INT(ClShowFreezeBars, cl_show_freeze_bars, 1, 0, 1, CFGFLAG_SAVE | CFGFLAG_CLIENT, "Whether to show a freeze bar under frozen players to indicate the thaw time") MACRO_CONFIG_INT(SvResetPickups, sv_reset_pickups, 0, 0, 1, CFGFLAG_SERVER | CFGFLAG_GAME, "Whether the weapons are reset on passing the start tile or not") MACRO_CONFIG_INT(ClShowOthers, cl_show_others, 0, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show players in other teams (2 to show own team only)") MACRO_CONFIG_INT(ClShowOthersAlpha, cl_show_others_alpha, 40, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Show players in other teams (alpha value, 0 invisible, 100 fully visible)") diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp index 5336cccf3..e37bbab2f 100644 --- a/src/game/client/components/hud.cpp +++ b/src/game/client/components/hud.cpp @@ -843,73 +843,75 @@ void CHud::RenderPlayerState(const int ClientID) // pCharacter contains the predicted character for local players or the last snap for players who are spectated CCharacterCore *pCharacter = &m_pClient->m_aClients[ClientID].m_Predicted; - - int TotalJumpsToDisplay, AvailableJumpsToDisplay; - if(m_pClient->m_Snap.m_aCharacters[ClientID].m_HasExtendedDisplayInfo) + int TotalJumpsToDisplay = 0, AvailableJumpsToDisplay = 0; + if(g_Config.m_ClShowJumpsIndicator) { - bool Grounded = false; - if(Collision()->CheckPoint(pCharacter->m_Pos.x + CCharacterCore::PhysicalSize() / 2, - pCharacter->m_Pos.y + CCharacterCore::PhysicalSize() / 2 + 5)) + if(m_pClient->m_Snap.m_aCharacters[ClientID].m_HasExtendedDisplayInfo) { - Grounded = true; + bool Grounded = false; + if(Collision()->CheckPoint(pCharacter->m_Pos.x + CCharacterCore::PhysicalSize() / 2, + pCharacter->m_Pos.y + CCharacterCore::PhysicalSize() / 2 + 5)) + { + Grounded = true; + } + if(Collision()->CheckPoint(pCharacter->m_Pos.x - CCharacterCore::PhysicalSize() / 2, + pCharacter->m_Pos.y + CCharacterCore::PhysicalSize() / 2 + 5)) + { + Grounded = true; + } + + int UsedJumps = pCharacter->m_JumpedTotal; + if(pCharacter->m_Jumps > 1) + { + UsedJumps += !Grounded; + } + else if(pCharacter->m_Jumps == 1) + { + // If the player has only one jump, each jump is the last one + UsedJumps = pCharacter->m_Jumped & 2; + } + else if(pCharacter->m_Jumps == -1) + { + // The player has only one ground jump + UsedJumps = !Grounded; + } + + if(pCharacter->m_EndlessJump && UsedJumps >= abs(pCharacter->m_Jumps)) + { + UsedJumps = abs(pCharacter->m_Jumps) - 1; + } + + int UnusedJumps = abs(pCharacter->m_Jumps) - UsedJumps; + if(!(pCharacter->m_Jumped & 2) && UnusedJumps <= 0) + { + // In some edge cases when the player just got another number of jumps, UnusedJumps is not correct + UnusedJumps = 1; + } + TotalJumpsToDisplay = maximum(minimum(abs(pCharacter->m_Jumps), 10), 0); + AvailableJumpsToDisplay = maximum(minimum(UnusedJumps, TotalJumpsToDisplay), 0); } - if(Collision()->CheckPoint(pCharacter->m_Pos.x - CCharacterCore::PhysicalSize() / 2, - pCharacter->m_Pos.y + CCharacterCore::PhysicalSize() / 2 + 5)) + else { - Grounded = true; + TotalJumpsToDisplay = AvailableJumpsToDisplay = abs(m_pClient->m_Snap.m_aCharacters[ClientID].m_ExtendedData.m_Jumps); } - int UsedJumps = pCharacter->m_JumpedTotal; - if(pCharacter->m_Jumps > 1) + // render available and used jumps + int JumpsOffsetY = ((GameClient()->m_GameInfo.m_HudHealthArmor && g_Config.m_ClShowhudHealthAmmo ? 24 : 0) + + (GameClient()->m_GameInfo.m_HudAmmo && g_Config.m_ClShowhudHealthAmmo ? 12 : 0)); + if(JumpsOffsetY > 0) { - UsedJumps += !Grounded; + Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjump); + Graphics()->RenderQuadContainerEx(m_HudQuadContainerIndex, m_AirjumpOffset, AvailableJumpsToDisplay, 0, JumpsOffsetY); + Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjumpEmpty); + Graphics()->RenderQuadContainerEx(m_HudQuadContainerIndex, m_AirjumpEmptyOffset + AvailableJumpsToDisplay, TotalJumpsToDisplay - AvailableJumpsToDisplay, 0, JumpsOffsetY); } - else if(pCharacter->m_Jumps == 1) + else { - // If the player has only one jump, each jump is the last one - UsedJumps = pCharacter->m_Jumped & 2; + Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjump); + Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_AirjumpOffset, AvailableJumpsToDisplay); + Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjumpEmpty); + Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_AirjumpEmptyOffset + AvailableJumpsToDisplay, TotalJumpsToDisplay - AvailableJumpsToDisplay); } - else if(pCharacter->m_Jumps == -1) - { - // The player has only one ground jump - UsedJumps = !Grounded; - } - - if(pCharacter->m_EndlessJump && UsedJumps >= abs(pCharacter->m_Jumps)) - { - UsedJumps = abs(pCharacter->m_Jumps) - 1; - } - - int UnusedJumps = abs(pCharacter->m_Jumps) - UsedJumps; - if(!(pCharacter->m_Jumped & 2) && UnusedJumps <= 0) - { - // In some edge cases when the player just got another number of jumps, UnusedJumps is not correct - UnusedJumps = 1; - } - TotalJumpsToDisplay = maximum(minimum(abs(pCharacter->m_Jumps), 10), 0); - AvailableJumpsToDisplay = maximum(minimum(UnusedJumps, TotalJumpsToDisplay), 0); - } - else - { - TotalJumpsToDisplay = AvailableJumpsToDisplay = abs(m_pClient->m_Snap.m_aCharacters[ClientID].m_ExtendedData.m_Jumps); - } - - // render available and used jumps - int JumpsOffsetY = ((GameClient()->m_GameInfo.m_HudHealthArmor && g_Config.m_ClShowhudHealthAmmo ? 24 : 0) + - (GameClient()->m_GameInfo.m_HudAmmo && g_Config.m_ClShowhudHealthAmmo ? 12 : 0)); - if(JumpsOffsetY > 0) - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjump); - Graphics()->RenderQuadContainerEx(m_HudQuadContainerIndex, m_AirjumpOffset, AvailableJumpsToDisplay, 0, JumpsOffsetY); - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjumpEmpty); - Graphics()->RenderQuadContainerEx(m_HudQuadContainerIndex, m_AirjumpEmptyOffset + AvailableJumpsToDisplay, TotalJumpsToDisplay - AvailableJumpsToDisplay, 0, JumpsOffsetY); - } - else - { - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjump); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_AirjumpOffset, AvailableJumpsToDisplay); - Graphics()->TextureSet(m_pClient->m_HudSkin.m_SpriteHudAirjumpEmpty); - Graphics()->RenderQuadContainer(m_HudQuadContainerIndex, m_AirjumpEmptyOffset + AvailableJumpsToDisplay, TotalJumpsToDisplay - AvailableJumpsToDisplay); } float x = 5 + 12; diff --git a/src/game/client/components/menus_settings.cpp b/src/game/client/components/menus_settings.cpp index 2f746b7a2..659d7ab9e 100644 --- a/src/game/client/components/menus_settings.cpp +++ b/src/game/client/components/menus_settings.cpp @@ -2541,10 +2541,9 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) // ***** HUD ***** // DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhud, Localize("Show ingame HUD"), &g_Config.m_ClShowhud, &MainView, LineMargin); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClDDRaceHud, Localize("Use DDRace HUD"), &g_Config.m_ClDDRaceHud, &MainView, LineMargin); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClDDRaceScoreBoard, Localize("Use DDRace Scoreboard"), &g_Config.m_ClDDRaceScoreBoard, &MainView, LineMargin); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudDummyActions, Localize("Show dummy actions"), &g_Config.m_ClShowhudDummyActions, &MainView, LineMargin); - DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowFreezeBars, Localize("Show freeze bars"), &g_Config.m_ClShowFreezeBars, &MainView, LineMargin); + DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowJumpsIndicator, Localize("Show jump indicator"), &g_Config.m_ClShowJumpsIndicator, &MainView, LineMargin); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowIDs, Localize("Show client IDs"), &g_Config.m_ClShowIDs, &MainView, LineMargin); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudPlayerPosition, Localize("Show player position"), &g_Config.m_ClShowhudPlayerPosition, &MainView, LineMargin); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowhudPlayerSpeed, Localize("Show player speed"), &g_Config.m_ClShowhudPlayerSpeed, &MainView, LineMargin); @@ -2555,32 +2554,22 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClChatTeamColors, Localize("Show names in chat in team colors"), &g_Config.m_ClChatTeamColors, &MainView, LineMargin); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowVotesAfterVoting, Localize("Show votes window after voting"), &g_Config.m_ClShowVotesAfterVoting, &MainView, LineMargin); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowKillMessages, Localize("Show kill messages"), &g_Config.m_ClShowKillMessages, &MainView, LineMargin); + DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_ClShowFreezeBars, Localize("Show freeze bars"), &g_Config.m_ClShowFreezeBars, &MainView, LineMargin); { - CUIRect Button, Label; - MainView.HSplitTop(2.5f, 0, &MainView); - MainView.HSplitTop(20.0f, &Label, &MainView); - MainView.HSplitTop(20.0f, &Button, &MainView); - str_format(aBuf, sizeof(aBuf), "%s: %i", Localize("Opacity of freeze bars inside freeze"), g_Config.m_ClFreezeBarsAlphaInsideFreeze); - UI()->DoLabel(&Label, aBuf, 13.0f, TEXTALIGN_LEFT); - g_Config.m_ClFreezeBarsAlphaInsideFreeze = (int)(UIEx()->DoScrollbarH(&g_Config.m_ClFreezeBarsAlphaInsideFreeze, &Button, g_Config.m_ClFreezeBarsAlphaInsideFreeze / 100.0f) * 100.0f); + if(g_Config.m_ClShowFreezeBars) + { + CUIRect Button, Label; + MainView.HSplitTop(2.5f, 0, &MainView); + MainView.HSplitTop(20.0f, &Label, &MainView); + MainView.HSplitTop(20.0f, &Button, &MainView); + str_format(aBuf, sizeof(aBuf), "%s: %i", Localize("Opacity of freeze bars inside freeze"), g_Config.m_ClFreezeBarsAlphaInsideFreeze); + UI()->DoLabel(&Label, aBuf, 13.0f, TEXTALIGN_LEFT); + g_Config.m_ClFreezeBarsAlphaInsideFreeze = (int)(UIEx()->DoScrollbarH(&g_Config.m_ClFreezeBarsAlphaInsideFreeze, &Button, g_Config.m_ClFreezeBarsAlphaInsideFreeze / 100.0f) * 100.0f); + } } MainView.HSplitTop(30.0f, 0x0, &MainView); - // ***** Kill Messages ***** // - - MainView.HSplitTop(30.0f, &Section, &MainView); - UI()->DoLabel(&Section, Localize("Kill Messages"), 20.0f, TEXTALIGN_LEFT); - MainView.VSplitLeft(5.0f, 0x0, &MainView); - - MainView.HSplitTop(10.0f, 0x0, &MainView); - - static int KillMessageNormalColorID; - DoLine_ColorPicker(&KillMessageNormalColorID, 25.0f, 250.0f, 13.0f, 5.0f, &MainView, Localize("Kill Message Normal Color"), &g_Config.m_ClKillMessageNormalColor, ColorRGBA(1.0f, 1.0f, 1.0f), false); - - static int KillMessageHighlightColorID; - DoLine_ColorPicker(&KillMessageHighlightColorID, 25.0f, 250.0f, 13.0f, 5.0f, &MainView, Localize("Kill Message Highlight Color"), &g_Config.m_ClKillMessageHighlightColor, ColorRGBA(1.0f, 1.0f, 1.0f), false); - // ***** Laser ***** // MainView = Column; @@ -2607,6 +2596,8 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) DoLaserPreview(&Section, LaserOutlineColor, LaserInnerColor); + // ***** Hookline ***** // + MainView.HSplitTop(25.0f, 0x0, &MainView); MainView.HSplitTop(20.0f, &SectionTwo, &MainView); @@ -2646,6 +2637,23 @@ void CMenus::RenderSettingsHUD(CUIRect MainView) MainView.HSplitTop(25.0f, &SectionTwo, &MainView); DoLine_ColorPicker(&HookCollTeeCollResetID, 25.0f, 180.0f, 13.0f, 5.0f, &SectionTwo, Localize("Tee"), &g_Config.m_ClHookCollColorTeeColl, ColorRGBA(1.0f, 1.0f, 0.0f, 1.0f), false); + + // ***** Kill Messages ***** // + + MainView.HSplitTop(25.0f, 0x0, &MainView); + MainView.HSplitTop(20.0f, &Section, &MainView); + UI()->DoLabel(&Section, Localize("Kill Messages"), 20.0f, TEXTALIGN_LEFT); + + MainView.HSplitTop(5.0f, 0x0, &MainView); + MainView.HSplitTop(25.0f, &SectionTwo, &MainView); + + static int KillMessageNormalColorID, KillMessageHighlightColorID; + DoLine_ColorPicker(&KillMessageNormalColorID, 25.0f, 180.0f, 13.0f, 5.0f, &SectionTwo, Localize("Normal Color"), &g_Config.m_ClKillMessageNormalColor, ColorRGBA(1.0f, 1.0f, 1.0f), false); + + MainView.HSplitTop(5.0f, 0x0, &MainView); + MainView.HSplitTop(25.0f, &SectionTwo, &MainView); + + DoLine_ColorPicker(&KillMessageHighlightColorID, 25.0f, 180.0f, 13.0f, 5.0f, &SectionTwo, Localize("Highlight Color"), &g_Config.m_ClKillMessageHighlightColor, ColorRGBA(1.0f, 1.0f, 1.0f), false); } else if(s_CurTab == 1) { // ***** CHAT TAB ***** //