move notifications from surface to imgui

add notification icon support
This commit is contained in:
rei-2
2026-06-20 11:39:54 -04:00
parent bf103d6e2f
commit c3c30a3354
19 changed files with 637 additions and 350 deletions
+3 -2
View File
@@ -950,7 +950,7 @@
<ClCompile Include="src\Features\Visuals\Groups\Groups.cpp" />
<ClCompile Include="src\Features\Visuals\PlayerConditions\PlayerConditions.cpp" />
<ClCompile Include="src\Features\Visuals\Materials\Materials.cpp" />
<ClCompile Include="src\Features\Visuals\Notifications\Notifications.cpp" />
<ClCompile Include="src\Features\ImGui\Notifications\Notifications.cpp" />
<ClCompile Include="src\Features\Visuals\OffscreenArrows\OffscreenArrows.cpp" />
<ClCompile Include="src\Features\Visuals\SpectatorList\SpectatorList.cpp" />
<ClCompile Include="src\Features\Visuals\Visuals.cpp" />
@@ -1227,6 +1227,7 @@
<ClInclude Include="src\Features\Aimbot\AutoHeal\AutoHeal.h" />
<ClInclude Include="src\Features\AntiCheatCompatibility\AntiCheatCompatibility.h" />
<ClInclude Include="src\Features\Debug\Debug.h" />
<ClInclude Include="src\Features\ImGui\Easings\Easings.h" />
<ClInclude Include="src\Features\Output\Output.h" />
<ClInclude Include="src\Features\Misc\AutoQueue\AutoQueue.h" />
<ClInclude Include="src\Features\Backtrack\Backtrack.h" />
@@ -1388,7 +1389,7 @@
<ClInclude Include="src\Features\Players\PlayerCore.h" />
<ClInclude Include="src\Features\Players\PlayerUtils.h" />
<ClInclude Include="src\Features\Visuals\Materials\Materials.h" />
<ClInclude Include="src\Features\Visuals\Notifications\Notifications.h" />
<ClInclude Include="src\Features\ImGui\Notifications\Notifications.h" />
<ClInclude Include="src\SDK\Definitions\Classes.h" />
<ClInclude Include="src\SDK\Definitions\Definitions.h" />
<ClInclude Include="src\SDK\Definitions\Interfaces.h" />
+3 -2
View File
@@ -9,7 +9,7 @@
<ClCompile Include="src\Features\Players\PlayerCore.cpp" />
<ClCompile Include="src\Features\Players\PlayerUtils.cpp" />
<ClCompile Include="src\Features\Visuals\Materials\Materials.cpp" />
<ClCompile Include="src\Features\Visuals\Notifications\Notifications.cpp" />
<ClCompile Include="src\Features\ImGui\Notifications\Notifications.cpp" />
<ClCompile Include="src\SDK\Definitions\Main\INetMessage.cpp" />
<ClCompile Include="src\SDK\Definitions\Main\KeyValues.cpp" />
<ClCompile Include="src\SDK\Definitions\Misc\bitbuf.cpp" />
@@ -225,7 +225,7 @@
<ClInclude Include="src\Features\Players\PlayerCore.h" />
<ClInclude Include="src\Features\Players\PlayerUtils.h" />
<ClInclude Include="src\Features\Visuals\Materials\Materials.h" />
<ClInclude Include="src\Features\Visuals\Notifications\Notifications.h" />
<ClInclude Include="src\Features\ImGui\Notifications\Notifications.h" />
<ClInclude Include="src\SDK\Definitions\Interfaces\CClientModeShared.h" />
<ClInclude Include="src\SDK\Definitions\Interfaces\CClientState.h" />
<ClInclude Include="src\SDK\Definitions\Interfaces\CGlobalVarsBase.h" />
@@ -625,6 +625,7 @@
<ClInclude Include="src\SDK\Definitions\Misc\CUtlShared.h" />
<ClInclude Include="src\Features\AntiCheatCompatibility\AntiCheatCompatibility.h" />
<ClInclude Include="src\Features\Debug\Debug.h" />
<ClInclude Include="src\Features\ImGui\Easings\Easings.h" />
</ItemGroup>
<ItemGroup>
<None Include="cpp.hint" />
+5 -5
View File
@@ -35,12 +35,12 @@ static inline bool CheckDXLevel()
/*
const char* sMessage = "You are running with graphics options that Amalgam does not support. -dxlevel must be at least 90.";
U::Core.AppendFailText(sMessage);
SDK::Output("Amalgam", sMessage, DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", sMessage, ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
return false;
*/
const char* sMessage = "You are running with graphics options that Amalgam does not support. It is recommended for -dxlevel to be at least 90.";
SDK::Output("Amalgam", sMessage, DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", sMessage, WARNING_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_WARNING);
}
return true;
@@ -74,7 +74,7 @@ void CCore::LogFailText()
}
catch (...) {}
SDK::Output("Failed to load", m_ssFailStream.str().c_str(), {}, OUTPUT_DEBUG, MB_OK | MB_ICONERROR);
SDK::Output("Failed to load", m_ssFailStream.str().c_str(), {}, OUTPUT_DEBUG, nullptr, MB_OK | MB_ICONERROR);
}
void CCore::Load()
@@ -116,7 +116,7 @@ void CCore::Load()
H::Fonts.Reload();
F::Configs.LoadConfig(F::Configs.m_sCurrentConfig, false);
SDK::Output("Amalgam", "Loaded", DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Loaded", INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
void CCore::Loop()
@@ -174,5 +174,5 @@ void CCore::Unload()
return;
}
SDK::Output("Amalgam", "Unloaded", DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Unloaded", INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_DEBUG);
}
+22 -22
View File
@@ -392,7 +392,7 @@ static inline void LoadMain(BaseVar*& pBase, boost::property_tree::ptree& tTree)
}
}
else if (!(pVar->m_iFlags & NOSAVE))
SDK::Output("Amalgam", std::format("{} not found", pVar->Name()).c_str(), ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("{} not found", pVar->Name()).c_str(), ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
#define Load(t, j) if (IsType(t)) LoadMain<t>(pBase, j);
@@ -486,11 +486,11 @@ bool CConfigs::SaveConfig(const std::string& sConfigName, bool bNotify)
m_sCurrentConfig = sConfigName; m_sCurrentVisuals = "";
if (bNotify)
SDK::Output("Amalgam", std::format("Config {} saved", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Config {} saved", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Save config failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Save config failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
return false;
}
@@ -538,7 +538,7 @@ bool CConfigs::LoadConfig(const std::string& sConfigName, bool bNotify)
}
}
else
SDK::Output("Amalgam", "Config binds not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Config binds not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
if (auto tSub = tRead.get_child_optional("Vars");
tSub || (tSub = tRead.get_child_optional("ConVars")))
@@ -563,7 +563,7 @@ bool CConfigs::LoadConfig(const std::string& sConfigName, bool bNotify)
}
}
else
SDK::Output("Amalgam", "Config vars not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Config vars not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
if (auto tSub = tRead.get_child_optional("Groups"))
{
@@ -595,18 +595,18 @@ bool CConfigs::LoadConfig(const std::string& sConfigName, bool bNotify)
}
}
else
SDK::Output("Amalgam", "Config groups not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Config groups not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
F::Binds.SetVars(nullptr, nullptr, false);
H::Fonts.Reload();
m_sCurrentConfig = sConfigName; m_sCurrentVisuals = "";
if (bNotify)
SDK::Output("Amalgam", std::format("Config {} loaded", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Config {} loaded", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Load config failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Load config failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
return false;
}
@@ -694,11 +694,11 @@ bool CConfigs::SaveVisual(const std::string& sConfigName, bool bNotify)
write_json(m_sVisualsPath + sConfigName + m_sConfigExtension, tWrite);
if (bNotify)
SDK::Output("Amalgam", std::format("Visual config {} saved", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Visual config {} saved", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Save visuals failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Save visuals failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
return false;
}
return true;
@@ -739,7 +739,7 @@ bool CConfigs::LoadVisual(const std::string& sConfigName, bool bNotify)
}
}
else
SDK::Output("Amalgam", "Config vars not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Config vars not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
if (auto tSub = tRead.get_child_optional("Groups"))
{
@@ -771,17 +771,17 @@ bool CConfigs::LoadVisual(const std::string& sConfigName, bool bNotify)
}
}
else
SDK::Output("Amalgam", "Config groups not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Config groups not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
F::Binds.SetVars(nullptr, nullptr, false);
m_sCurrentVisuals = sConfigName;
if (bNotify)
SDK::Output("Amalgam", std::format("Visual config {} loaded", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Visual config {} loaded", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Load visuals failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Load visuals failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
return false;
}
return true;
@@ -811,11 +811,11 @@ void CConfigs::DeleteConfig(const std::string& sConfigName, bool bNotify)
LoadConfig("default", false);
if (bNotify)
SDK::Output("Amalgam", std::format("Config {} deleted", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Config {} deleted", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Remove config failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Remove config failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
}
@@ -850,11 +850,11 @@ void CConfigs::ResetConfig(const std::string& sConfigName, bool bNotify)
H::Fonts.Reload();
if (bNotify)
SDK::Output("Amalgam", std::format("Config {} reset", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Config {} reset", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Reset config failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Reset config failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
}
@@ -865,11 +865,11 @@ void CConfigs::DeleteVisual(const std::string& sConfigName, bool bNotify)
std::filesystem::remove(m_sVisualsPath + sConfigName + m_sConfigExtension);
if (bNotify)
SDK::Output("Amalgam", std::format("Visual config {} deleted", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Visual config {} deleted", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Remove visuals failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Remove visuals failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
}
@@ -902,10 +902,10 @@ void CConfigs::ResetVisual(const std::string& sConfigName, bool bNotify)
F::Binds.SetVars(nullptr, nullptr, false);
if (bNotify)
SDK::Output("Amalgam", std::format("Visual config {} reset", sConfigName).c_str(), DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", std::format("Visual config {} reset", sConfigName).c_str(), INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Reset visuals failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Reset visuals failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
}
@@ -0,0 +1,192 @@
#pragma once
#include "../../../Utils/Math/BaseMath.h"
namespace Ease
{
template <typename T> inline T OutSine(T x)
{
return sin((x * Math::PI_V<T>) / T(2));
}
template <typename T> inline T InSine(T x)
{
return T(1) - cos((x * Math::PI_V<T>) / T(2));
}
template <typename T> inline T InOutSine(T x)
{
return -(cos(x * Math::PI_V<T>) - T(1)) / T(2);
}
template <typename T> inline T OutQuad(T x)
{
return T(1) - pow(T(1) - x, T(2));
}
template <typename T> inline T InQuad(T x)
{
return pow(x, T(2));
}
template <typename T> inline T InOutQuad(T x)
{
return x < T(0.5) ? T(2) * pow(x, T(2)) : T(1) - pow(-T(2) * x + T(2), T(2)) / T(2);
}
template <typename T> inline T OutCubic(T x)
{
return T(1) - pow(T(1) - x, T(3));
}
template <typename T> inline T InCubic(T x)
{
return pow(x, T(3));
}
template <typename T> inline T InOutCubic(T x)
{
return x < T(0.5) ? T(4) * pow(x, T(3)) : T(1) - pow(-T(2) * x + T(2), T(3)) / T(2);
}
template <typename T> inline T OutQuart(T x)
{
return T(1) - pow(T(1) - x, T(4));
}
template <typename T> inline T InQuart(T x)
{
return pow(x, T(4));
}
template <typename T> inline T InOutQuart(T x)
{
return x < T(0.5) ? T(8) * pow(x, T(4)) : T(1) - pow(-T(2) * x + T(2), T(4)) / T(2);
}
template <typename T> inline T OutQuint(T x)
{
return T(1) - pow(T(1) - x, T(5));
}
template <typename T> inline T InQuint(T x)
{
return pow(x, T(5));
}
template <typename T> inline T InOutQuint(T x)
{
return x < T(0.5) ? T(16) * pow(x, T(5)) : T(1) - pow(-T(2) * x + T(2), T(5)) / T(2);
}
template <typename T> inline T OutExpo(T x)
{
return x == T(1) ? T(1) : T(1) - pow(T(2), -T(10) * x);
}
template <typename T> inline T InExpo(T x)
{
return x == T(0) ? T(0) : pow(T(2), T(10) * x - T(10));
}
template <typename T> inline T InOutExpo(T x)
{
return x == T(0) ? T(0)
: x == T(1) ? T(1)
: x < T(0.5) ? pow(T(2), T(20) * x - T(10)) / T(2)
: (T(2) - pow(T(2), -T(20) * x + T(10))) / T(2);
}
template <typename T> inline T OutCirc(T x)
{
return sqrt(T(1) - pow(x - T(1), T(2)));
}
template <typename T> inline T InCirc(T x)
{
return T(1) - sqrt(T(1) - pow(x, T(2)));
}
template <typename T> inline T InOutCirc(T x)
{
return x < T(0.5)
? (T(1) - sqrt(T(1) - pow(T(2) * x, T(2)))) / T(2)
: (sqrt(T(1) - pow(-T(2) * x + T(2), T(2))) + T(1)) / T(2);
}
template <typename T> inline T OutBack(T x)
{
constexpr T c1 = T(1.70158);
constexpr T c3 = c1 + T(1);
return T(1) + c3 * pow(x - T(1), T(3)) + c1 * pow(x - T(1), T(2));
}
template <typename T> inline T InBack(T x)
{
constexpr T c1 = T(1.70158);
constexpr T c3 = c1 + T(1);
return c3 * pow(x, T(3)) - c1 * pow(x, T(2));
}
template <typename T> inline T InOutBack(T x)
{
constexpr T c1 = T(1.70158);
constexpr T c2 = c1 * T(1.525);
return x < T(0.5)
? (pow(T(2) * x, T(2)) * ((c2 + T(1)) * T(2) * x - c2)) / T(2)
: (pow(T(2) * x - T(2), T(2)) * ((c2 + T(1)) * (x * T(2) - T(2)) + c2) + T(2)) / T(2);
}
template <typename T> inline T OutElastic(T x)
{
constexpr T c4 = (T(2) * Math::PI_V<T>) / T(3);
return x == T(0) ? T(0)
: x == T(1) ? T(1)
: pow(T(2), -T(10) * x) * sin((x * T(10) - T(0.75)) * c4) + T(1);
}
template <typename T> inline T InElastic(T x)
{
constexpr T c4 = (T(2) * Math::PI_V<T>) / T(3);
return x == T(0) ? T(0)
: x == T(1) ? T(1)
: -pow(T(2), T(10) * x - T(10)) * sin((x * T(10) - T(10.75)) * c4);
}
template <typename T> inline T InOutElastic(T x)
{
constexpr T c5 = (T(2) * Math::PI_V<T>) / T(4.5);
return x == T(0) ? T(0)
: x == T(1) ? T(1)
: x < T(0.5) ? -(pow(T(2), T(20) * x - T(10)) * sin((T(20) * x - T(11.125)) * c5)) / T(2)
: (pow(T(2), -T(20) * x + T(10)) * sin((T(20) * x - T(11.125)) * c5)) / T(2) + T(1);
}
template <typename T> inline T OutBounce(T x)
{
constexpr T n1 = T(7.5625);
constexpr T d1 = T(2.75);
return x < T(1) / d1 ? n1 * x * x
: x < T(2) / d1 ? n1 * (x -= T(1.5) / d1) * x + T(0.75)
: x < T(2.5) / d1 ? n1 * (x -= T(2.25) / d1) * x + T(0.9375)
: n1 * (x -= T(2.625) / d1) * x + T(0.984375);
}
template <typename T> inline T InBounce(T x)
{
return T(1) - OutBounce(T(1) - x);
}
template <typename T> inline T InOutBounce(T x)
{
return x < T(0.5)
? (T(1) - OutBounce(T(1) - T(2) * x)) / T(2)
: (T(1) + OutBounce(T(2) * x - T(1))) / T(2);
}
}
+76 -56
View File
@@ -50,47 +50,47 @@ static inline ImVec2& operator/=(ImVec2& lhs, const ImVec2& rhs) { lhs.x /= rhs.
namespace ImGui
{
std::unordered_map<uint32_t, int> mActiveMap = {};
inline std::unordered_map<uint32_t, int> ActiveMap = {};
bool Disabled = false, Transparent = false;
int CurrentBind = DEFAULT_BIND;
bool Hovered = false;
inline bool Disabled = false, Transparent = false;
inline int CurrentBind = DEFAULT_BIND;
inline bool Hovered = false;
std::vector<bool> vDisabled = {}, vTransparent = {};
inline std::vector<bool> DisabledVec = {}, TransparentVec = {};
inline void PushDisabled(bool bDisabled)
{
vDisabled.push_back(Disabled = bDisabled);
DisabledVec.push_back(Disabled = bDisabled);
}
inline void PopDisabled(int count = 1)
{
int iSize = int(vDisabled.size());
int iSize = int(DisabledVec.size());
if (iSize < count)
{
IM_ASSERT_USER_ERROR(0, "Calling PopDisabled() too many times: stack underflow.");
count = iSize;
}
for (int i = 0; i < count; i++)
vDisabled.pop_back();
Disabled = !vDisabled.empty() ? vDisabled.back() : false;
DisabledVec.pop_back();
Disabled = !DisabledVec.empty() ? DisabledVec.back() : false;
}
inline void PushTransparent(bool bTransparent, bool bPushAlpha = false)
{
vTransparent.push_back(Transparent = bTransparent);
TransparentVec.push_back(Transparent = bTransparent);
if (bPushAlpha)
PushStyleVar(ImGuiStyleVar_Alpha, !bTransparent ? 1.f : 0.5f);
}
inline void PopTransparent(int count = 1, int iPopAlpha = false)
{
int iSize = int(vTransparent.size());
int iSize = int(TransparentVec.size());
if (iSize < count)
{
IM_ASSERT_USER_ERROR(0, "Calling PopTransparent() too many times: stack underflow.");
count = iSize;
}
for (int i = 0; i < count; i++)
vTransparent.pop_back();
Transparent = !vTransparent.empty() ? vTransparent.back() : false;
TransparentVec.pop_back();
Transparent = !TransparentVec.empty() ? TransparentVec.back() : false;
if (iPopAlpha)
PopStyleVar(iPopAlpha);
@@ -151,16 +151,36 @@ namespace ImGui
return tColor.Value.x * flRed + tColor.Value.y * flGreen + tColor.Value.z * flBlue < flValue;
}
inline ImVec4 ColorToVec(Color_t tColor)
inline ImU32 ColorByteToInt(Color_t tColor)
{
return tColor.r << IM_COL32_R_SHIFT | tColor.g << IM_COL32_G_SHIFT | tColor.b << IM_COL32_B_SHIFT | tColor.a << IM_COL32_A_SHIFT;
}
inline Color_t ColorIntToByte(ImU32 tColor)
{
return { byte(tColor >> IM_COL32_R_SHIFT), byte(tColor >> IM_COL32_G_SHIFT), byte(tColor >> IM_COL32_B_SHIFT), byte(tColor >> IM_COL32_A_SHIFT) };
}
inline ImVec4 ColorByteToVec(Color_t tColor)
{
return { tColor.r / 255.f, tColor.g / 255.f, tColor.b / 255.f, tColor.a / 255.f };
}
inline Color_t VecToColor(ImVec4 tColor)
inline Color_t ColorVecToByte(ImVec4 tColor)
{
return { byte(tColor.x * 255), byte(tColor.y * 255), byte(tColor.z * 255), byte(tColor.w * 255) };
}
inline ImColor ColorByteToFloat(Color_t tColor)
{
return { tColor.r / 255.f, tColor.g / 255.f, tColor.b / 255.f, tColor.a / 255.f };
}
inline Color_t ColorFloatToByte(ImColor tColor)
{
return { byte(tColor.Value.x * 255), byte(tColor.Value.y * 255), byte(tColor.Value.z * 255), byte(tColor.Value.w * 255) };
}
inline void DebugDummy(ImVec2 vSize)
{
/*
@@ -232,13 +252,13 @@ namespace ImGui
if (!bHorizontal)
{
pDrawList->AddRectFilled(vDrawPos, vDrawPos + ImVec2(vSize.x, flSize), uTitle, H::Draw.Scale(4), ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight);
pDrawList->AddRectFilled(vDrawPos + ImVec2(0, flSize), vDrawPos + vSize, uBackground, H::Draw.Scale(4), ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight);
pDrawList->AddRectFilled(vDrawPos, vDrawPos + ImVec2(vSize.x, flSize), uTitle, H::Draw.Scale(4), ImDrawFlags_RoundCornersTop);
pDrawList->AddRectFilled(vDrawPos + ImVec2(0, flSize), vDrawPos + vSize, uBackground, H::Draw.Scale(4), ImDrawFlags_RoundCornersBottom);
}
else
{
pDrawList->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flSize, vSize.y), uTitle, H::Draw.Scale(4), ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomLeft);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flSize, 0), vDrawPos + vSize, uBackground, H::Draw.Scale(4), ImDrawFlags_RoundCornersTopRight | ImDrawFlags_RoundCornersBottomRight);
pDrawList->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flSize, vSize.y), uTitle, H::Draw.Scale(4), ImDrawFlags_RoundCornersLeft);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flSize, 0), vDrawPos + vSize, uBackground, H::Draw.Scale(4), ImDrawFlags_RoundCornersRight);
}
}
inline void RenderTwoToneBackground(float flSize, ImU32 uTitle, ImU32 uBackground, ImU32 uBorder, float flInset = H::Draw.Scale(), bool bVertical = true, bool bTwoToneBorder = true)
@@ -250,24 +270,24 @@ namespace ImGui
if (bVertical)
{
if (!bTwoToneBorder)
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(vSize.x - flInset, flSize), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(vSize.x - flInset, flSize), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersTop);
else
{
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(vSize.x - flInset, flSize - H::Draw.Scale()), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersTopRight);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(vSize.x - flInset, flSize - H::Draw.Scale()), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersTop);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flSize - H::Draw.Scale()), vDrawPos + ImVec2(vSize.x - flInset, flSize), uBorder);
}
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flSize), vDrawPos + vSize - ImVec2(flInset, flInset), uBackground, H::Draw.Scale(3), ImDrawFlags_RoundCornersBottomLeft | ImDrawFlags_RoundCornersBottomRight);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flSize), vDrawPos + vSize - ImVec2(flInset, flInset), uBackground, H::Draw.Scale(3), ImDrawFlags_RoundCornersBottom);
}
else
{
if (!bTwoToneBorder)
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(flSize, vSize.y - flInset), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomLeft);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(flSize, vSize.y - flInset), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersLeft);
else
{
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(flSize - H::Draw.Scale(), vSize.y - flInset), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomLeft);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(flSize - H::Draw.Scale(), vSize.y - flInset), uTitle, H::Draw.Scale(3), ImDrawFlags_RoundCornersLeft);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flSize - H::Draw.Scale(), flInset), vDrawPos + ImVec2(flSize, vSize.y - flInset), uBorder);
}
pDrawList->AddRectFilled(vDrawPos + ImVec2(flSize, flInset), vDrawPos + vSize - ImVec2(flInset, flInset), uBackground, H::Draw.Scale(3), ImDrawFlags_RoundCornersTopRight | ImDrawFlags_RoundCornersBottomRight);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flSize, flInset), vDrawPos + vSize - ImVec2(flInset, flInset), uBackground, H::Draw.Scale(3), ImDrawFlags_RoundCornersRight);
}
flInset += H::Draw.Scale(0.5f) - 0.5f - H::Draw.Scale();
@@ -1197,7 +1217,7 @@ namespace ImGui
float flOriginal1 = *pVar1, flOriginal2 = pVar2 ? *pVar2 : 0.f;
static std::unordered_map<uint32_t, std::pair<float, float>> mStaticVars = {};
if (!mActiveMap[uHash])
if (!ActiveMap[uHash])
mStaticVars[uHash] = { flOriginal1, flOriginal2 };
float& flSVar1 = mStaticVars[uHash].first, &flSVar2 = mStaticVars[uHash].second;
@@ -1251,7 +1271,7 @@ namespace ImGui
auto uHash2 = FNV1A::Hash32Const(std::format("{}## Text", sLabel).c_str());
static std::string sText, sInput;
if (!mActiveMap[uHash2])
if (!ActiveMap[uHash2])
sText = pVar2 ? FormatText(fmt, flSVar1, flSVar2) : FormatText(fmt, flSVar1);
else
{
@@ -1264,7 +1284,7 @@ namespace ImGui
{
try
{
bool bVar1 = mActiveMap[uHash2] == 1;
bool bVar1 = ActiveMap[uHash2] == 1;
float& pVar = bVar1 ? flSVar1 : flSVar2;
pVar = sText.length() ? std::stof(sText) : 0.f;
@@ -1291,7 +1311,7 @@ namespace ImGui
catch (...) {}
}
if (bEnter || IsMouseClicked(ImGuiMouseButton_Left) || U::KeyHandler.Pressed(VK_ESCAPE))
mActiveMap[uHash2] = false;
ActiveMap[uHash2] = false;
}
float flWidth = FCalcTextSize(sText.c_str()).x;
#ifdef ALTERNATE_FULL_SLIDER
@@ -1310,13 +1330,13 @@ namespace ImGui
{
if (!Disabled && IsItemHovered() && IsWindowHovered())
SetMouseCursor(ImGuiMouseCursor_TextInput);
if (mActiveMap[uHash2])
if (ActiveMap[uHash2])
pDrawList->AddRectFilled(vDrawPos + vOriginalPos2 + ImVec2(0, H::Draw.Scale(14)), vDrawPos + vOriginalPos2 + ImVec2(flWidth, H::Draw.Scale(15)), F::Render.Active);
else if (IsItemClicked())
{
float* pVar = !pVar2 || GetMousePos().x - vDrawPos.x - vOriginalPos2.x < flWidth / 2 ? pVar1 : pVar2;
sInput = std::format("{}", *pVar); // would use to_string but i don't like its formatting
mActiveMap[uHash2] = pVar == pVar1 ? 1 : 2;
ActiveMap[uHash2] = pVar == pVar1 ? 1 : 2;
}
}
}
@@ -1353,25 +1373,25 @@ namespace ImGui
if (!Disabled)
{
if (bWithin && !mActiveMap[uHash])
if (bWithin && !ActiveMap[uHash])
{
int iVar = vMouse.x - vDrawPos.x < (flLowerPos + flUpperPos) / 2 ? 1 : 2;
if (IsMouseClicked(ImGuiMouseButton_Left))
mActiveMap[uHash] = iVar;
ActiveMap[uHash] = iVar;
pDrawList->AddCircleFilled(vDrawPos + ImVec2((iVar == 1 ? flLowerPos : flUpperPos), vMins.y + H::Draw.Scale(1)), H::Draw.Scale(12), tTransparent);
}
else if (mActiveMap[uHash] && IsMouseDown(ImGuiMouseButton_Left))
else if (ActiveMap[uHash] && IsMouseDown(ImGuiMouseButton_Left))
{
bool bVar1 = mActiveMap[uHash] == 1;
bool bVar1 = ActiveMap[uHash] == 1;
float& flVar = bVar1 ? flSVar1 : flSVar2;
flVar = flMin + (flMax - flMin) * flMousePerc;
flVar = std::clamp(flVar - fnmodf(flVar, flStep), !bVar1 ? flSVar1 + flStep : flMin, bVar1 ? flSVar2 - flStep : flMax);
pDrawList->AddCircleFilled(vDrawPos + ImVec2((bVar1 ? flLowerPos : flUpperPos), vMins.y + H::Draw.Scale(1)), H::Draw.Scale(16), tTransparent);
}
else
mActiveMap[uHash] = false;
ActiveMap[uHash] = false;
if (iFlags & FSliderEnum::NoAutoUpdate ? !mActiveMap[uHash] : true)
if (iFlags & FSliderEnum::NoAutoUpdate ? !ActiveMap[uHash] : true)
{
*pVar1 = flSVar1;
*pVar2 = flSVar2;
@@ -1389,22 +1409,22 @@ namespace ImGui
if (!Disabled)
{
if (bWithin && !mActiveMap[uHash])
if (bWithin && !ActiveMap[uHash])
{
if (IsMouseClicked(ImGuiMouseButton_Left))
mActiveMap[uHash] = 1;
ActiveMap[uHash] = 1;
pDrawList->AddCircleFilled(vDrawPos + ImVec2(flPos, vMins.y + H::Draw.Scale(1)), H::Draw.Scale(12), tTransparent);
}
else if (mActiveMap[uHash] && IsMouseDown(ImGuiMouseButton_Left))
else if (ActiveMap[uHash] && IsMouseDown(ImGuiMouseButton_Left))
{
flSVar1 = flMin + (flMax - flMin) * flMousePerc;
flSVar1 = std::clamp(flSVar1 - fnmodf(flSVar1, flStep), flMin, flMax);
pDrawList->AddCircleFilled(vDrawPos + ImVec2(flPos, vMins.y + H::Draw.Scale(1)), H::Draw.Scale(16), tTransparent);
}
else
mActiveMap[uHash] = false;
ActiveMap[uHash] = false;
if (iFlags & FSliderEnum::NoAutoUpdate ? !mActiveMap[uHash] : true)
if (iFlags & FSliderEnum::NoAutoUpdate ? !ActiveMap[uHash] : true)
*pVar1 = flSVar1;
}
}
@@ -1715,10 +1735,10 @@ namespace ImGui
static std::string sPreview = "", sInput = "", sTab = "\n";
if (BeginCombo(std::format("##{}", sLabel).c_str(), "", ImGuiComboFlags_CustomPreview | ImGuiComboFlags_NoArrowButton | ImGuiComboFlags_HeightLarge))
{
if (!mActiveMap[uHash])
if (!ActiveMap[uHash])
sPreview = sInput = "";
mActiveMap[uHash] = true;
ActiveMap[uHash] = true;
// this textinput is being used as a temporary measure to prevent the main window drawing over the popup
ImVec2 vOriginalPos2 = GetCursorPos();
@@ -1836,7 +1856,7 @@ namespace ImGui
EndCombo();
}
else
mActiveMap[uHash] = false;
ActiveMap[uHash] = false;
if (!Disabled && IsItemHovered())
SetMouseCursor(ImGuiMouseCursor_TextInput);
if (pHovered)
@@ -1853,37 +1873,37 @@ namespace ImGui
PopFont();
SetCursorPos(vOriginalPos2 + ImVec2(H::Draw.Scale(12), H::Draw.Scale(8)));
TextUnformatted(TruncateText(mActiveMap[uHash] ? sPreview : *pVar, vSize.x - H::Draw.Scale(vEntries.empty() ? 24 : 45)).c_str());
TextUnformatted(TruncateText(ActiveMap[uHash] ? sPreview : *pVar, vSize.x - H::Draw.Scale(vEntries.empty() ? 24 : 45)).c_str());
if (!vEntries.empty())
{
SetCursorPos(vOriginalPos2 + ImVec2(vSize.x - H::Draw.Scale(24), H::Draw.Scale(-1)));
IconImage(mActiveMap[uHash] ? ICON_MD_KEYBOARD_ARROW_UP : ICON_MD_KEYBOARD_ARROW_DOWN);
IconImage(ActiveMap[uHash] ? ICON_MD_KEYBOARD_ARROW_UP : ICON_MD_KEYBOARD_ARROW_DOWN);
}
if (mActiveMap[uHash] || iFlags & FSDropdownEnum::Custom || vEntries.empty())
if (ActiveMap[uHash] || iFlags & FSDropdownEnum::Custom || vEntries.empty())
{
ImVec2 vDrawPos = GetDrawPos() + vOriginalPos2 + ImVec2(H::Draw.Scale(12), H::Draw.Scale(22));
vDrawPos.x = floorf(vDrawPos.x), vDrawPos.y = floorf(vDrawPos.y);
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(vSize.x - H::Draw.Scale(vEntries.empty() ? 25 : 45), H::Draw.Scale(2)), mActiveMap[uHash] ? F::Render.Active : F::Render.Inactive);
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(vSize.x - H::Draw.Scale(vEntries.empty() ? 25 : 45), H::Draw.Scale(2)), ActiveMap[uHash] ? F::Render.Active : F::Render.Inactive);
}
}
else
{
SetCursorPos(vOriginalPos2 + ImVec2(H::Draw.Scale(12), 0));
TextUnformatted(TruncateText(mActiveMap[uHash] ? sPreview : *pVar, vSize.x - H::Draw.Scale(vEntries.empty() ? 24 : 45)).c_str());
TextUnformatted(TruncateText(ActiveMap[uHash] ? sPreview : *pVar, vSize.x - H::Draw.Scale(vEntries.empty() ? 24 : 45)).c_str());
if (!vEntries.empty())
{
SetCursorPos(vOriginalPos2 + ImVec2(vSize.x - H::Draw.Scale(24), H::Draw.Scale(-1)));
IconImage(mActiveMap[uHash] ? ICON_MD_KEYBOARD_ARROW_UP : ICON_MD_KEYBOARD_ARROW_DOWN);
IconImage(ActiveMap[uHash] ? ICON_MD_KEYBOARD_ARROW_UP : ICON_MD_KEYBOARD_ARROW_DOWN);
}
if (mActiveMap[uHash] || iFlags & FSDropdownEnum::Custom || vEntries.empty())
if (ActiveMap[uHash] || iFlags & FSDropdownEnum::Custom || vEntries.empty())
{
ImVec2 vDrawPos = GetDrawPos() + vOriginalPos2 + ImVec2(H::Draw.Scale(12), H::Draw.Scale(14));
vDrawPos.x = floorf(vDrawPos.x), vDrawPos.y = floorf(vDrawPos.y);
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(vSize.x - H::Draw.Scale(vEntries.empty() ? 25 : 45), H::Draw.Scale(2)), mActiveMap[uHash] ? F::Render.Active : F::Render.Inactive);
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(vSize.x - H::Draw.Scale(vEntries.empty() ? 25 : 45), H::Draw.Scale(2)), ActiveMap[uHash] ? F::Render.Active : F::Render.Inactive);
}
}
@@ -1924,10 +1944,10 @@ namespace ImGui
PushStyleVar(ImGuiStyleVar_PopupBorderSize, H::Draw.Scale());
PushStyleColor(ImGuiCol_PopupBg, F::Render.Background0p5.Value);
ImVec4 tTempColor = ColorToVec(*pColor);
ImVec4 tTempColor = ColorByteToVec(*pColor);
bool bReturn = ColorEdit4(std::format("##{}", sLabel).c_str(), &tTempColor.x, ImGuiColorEditFlags_AlphaBar | ImGuiColorEditFlags_LargeAlphaGrid | ImGuiColorEditFlags_NoRoundRestrict | ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_NoBorder | ImGuiColorEditFlags_NoTooltip, vSize);
if (bReturn)
*pColor = VecToColor(tTempColor);
*pColor = ColorVecToByte(tTempColor);
if (!Disabled && IsItemHovered())
SetMouseCursor(ImGuiMouseCursor_Hand);
@@ -2318,7 +2338,7 @@ namespace ImGui
return tVar[iParent];
}
bool bPushedDisabled = false, bPushedTransparent = false;
static bool bPushedDisabled = false, bPushedTransparent = false;
template <class T>
inline T& FGet(ConfigVar<T>& tVar, bool bDisable = false)
+40 -30
View File
@@ -1,6 +1,7 @@
#include "Menu.h"
#include "Components.h"
#include "../Notifications/Notifications.h"
#include "../../Configs/Configs.h"
#include "../../Binds/Binds.h"
#include "../../Visuals/Groups/Groups.h"
@@ -69,11 +70,11 @@ void CMenu::DrawMenu()
PopStyleColor();
}
else
pDrawList->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flSize - flInset, vWindowSize.y), F::Render.Background0, H::Draw.Scale(3), ImDrawFlags_RoundCornersTopLeft | ImDrawFlags_RoundCornersBottomLeft);
pDrawList->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flSize - flInset, vWindowSize.y), F::Render.Background0, H::Draw.Scale(3), ImDrawFlags_RoundCornersLeft);
PushClipRect({ 0, 0 }, { ImGui::GetIO().DisplaySize.x, ImGui::GetIO().DisplaySize.y }, false);
pDrawList->PushClipRect({ 0, 0 }, { GetIO().DisplaySize.x, GetIO().DisplaySize.y }, false);
RenderTwoToneBackground(flSize, {}, F::Render.Background1, F::Render.Background2, 0.f, false);
PopClipRect();
pDrawList->PopClipRect();
static int iTab = 0, iAimbotTab = 0, iVisualsTab = 0, iLogsTab = 0, iSettingsTab = 0;
PushFont(F::Render.FontBold);
@@ -849,7 +850,7 @@ void CMenu::MenuVisuals(int iTab)
// background
float flWidth = GetWindowWidth() / 2 - GetStyle().WindowPadding.x * 1.5f;
float flHeight = H::Draw.Scale(28);
ImColor tColor = ColorToVec(tGroup.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.5f, LerpEnum::NoAlpha));
ImColor tColor = ColorByteToFloat(tGroup.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.5f, LerpEnum::NoAlpha));
ImVec2 vDrawPos = GetDrawPos() + vOriginalPos;
if (iCurrentGroup != iGroup)
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flWidth, flHeight), tColor, H::Draw.Scale(4));
@@ -858,7 +859,7 @@ void CMenu::MenuVisuals(int iTab)
ImColor tColor2 = { tColor.Value.x * 1.1f, tColor.Value.y * 1.1f, tColor.Value.z * 1.1f, tColor.Value.w };
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flWidth, flHeight), tColor2, H::Draw.Scale(4));
tColor2 = ColorToVec(tGroup.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.25f, LerpEnum::NoAlpha));
tColor2 = ColorByteToFloat(tGroup.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.25f, LerpEnum::NoAlpha));
float flInset = H::Draw.Scale(0.5f) - 0.5f;
GetWindowDrawList()->AddRect(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(flWidth - flInset, flHeight - flInset), tColor2, H::Draw.Scale(4), ImDrawFlags_None, H::Draw.Scale());
}
@@ -1483,7 +1484,7 @@ void CMenu::MenuLogs(int iTab)
// background
float flWidth = GetWindowWidth() / 2 - GetStyle().WindowPadding.x * 1.5f;
float flHeight = H::Draw.Scale(28);
ImColor tColor = ColorToVec(fGetTeamColor(tPlayer.m_iTeam, tPlayer.m_bAlive));
ImColor tColor = ColorByteToFloat(fGetTeamColor(tPlayer.m_iTeam, tPlayer.m_bAlive));
ImVec2 vDrawPos = GetDrawPos() + vOriginalPos;
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flWidth, flHeight), tColor, H::Draw.Scale(4));
@@ -1532,14 +1533,14 @@ void CMenu::MenuLogs(int iTab)
float flTagOffset = H::Draw.Scale(4);
auto fDrawTag = [&](PriorityLabel_t& tTag, int iID)
{
ImColor tTagColor = ColorToVec(tTag.m_tColor);
ImColor tTagColor = ColorByteToFloat(tTag.m_tColor);
float flTagWidth = FCalcTextSize(tTag.m_sName.c_str()).x + H::Draw.Scale(!iID ? 10 : 25);
float flTagHeight = H::Draw.Scale(20);
ImVec2 vTagPos = { flTagOffset, H::Draw.Scale(4) };
GetWindowDrawList()->AddRectFilled(vDrawPos + vTagPos, vDrawPos + vTagPos + ImVec2(flTagWidth, flTagHeight), tTagColor, H::Draw.Scale(4));
SetCursorPos(vTagPos + ImVec2(H::Draw.Scale(5), H::Draw.Scale(3)));
TextColored(VecToColor(tColor).Blend(tTag.m_tColor).IsColorBright() ? ImVec4(0, 0, 0, 1) : ImVec4(1, 1, 1, 1), tTag.m_sName.c_str());
TextColored(ColorFloatToByte(tColor).Blend(tTag.m_tColor).IsColorBright() ? ImVec4(0, 0, 0, 1) : ImVec4(1, 1, 1, 1), tTag.m_sName.c_str());
if (iID)
{
SetCursorPos(vTagPos + ImVec2(flTagWidth - H::Draw.Scale(22), H::Draw.Scale(-2)));
@@ -1636,10 +1637,10 @@ void CMenu::MenuLogs(int iTab)
if (!tTag.m_bAssignable || F::PlayerUtils.HasTag(tPlayer.m_uAccountID, iID))
continue;
auto imColor = ColorToVec(tTag.m_tColor);
PushStyleColor(ImGuiCol_Text, imColor);
imColor.x /= 3; imColor.y /= 3; imColor.z /= 3;
if (FSelectable(tTag.m_sName.c_str(), imColor))
ImVec4 tColor = ColorByteToVec(tTag.m_tColor);
PushStyleColor(ImGuiCol_Text, tColor);
tColor.x /= 3; tColor.y /= 3; tColor.z /= 3;
if (FSelectable(tTag.m_sName.c_str(), tColor))
F::PlayerUtils.AddTag(tPlayer.m_uAccountID, iID, true, tPlayer.m_sName.c_str());
PopStyleColor();
}
@@ -1910,7 +1911,7 @@ void CMenu::MenuLogs(int iTab)
// background
float flWidth = GetWindowWidth() * (_tTag.m_bLabel ? 1.f / 3 : 2.f / 3) - GetStyle().WindowPadding.x * 1.5f;
float flHeight = H::Draw.Scale(28);
ImColor tColor = ColorToVec(_tTag.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.5f, LerpEnum::NoAlpha));
ImColor tColor = ColorByteToFloat(_tTag.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.5f, LerpEnum::NoAlpha));
ImVec2 vDrawPos = GetDrawPos() + vOriginalPos;
if (iID != _iID)
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flWidth, flHeight), tColor, H::Draw.Scale(4));
@@ -1919,7 +1920,7 @@ void CMenu::MenuLogs(int iTab)
ImColor tColor2 = { tColor.Value.x * 1.1f, tColor.Value.y * 1.1f, tColor.Value.z * 1.1f, tColor.Value.w };
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flWidth, flHeight), tColor2, H::Draw.Scale(4));
tColor2 = ColorToVec(_tTag.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.25f, LerpEnum::NoAlpha));
tColor2 = ColorByteToFloat(_tTag.m_tColor.Lerp(Vars::Menu::Theme::Background.Value, 0.25f, LerpEnum::NoAlpha));
float flInset = H::Draw.Scale(0.5f) - 0.5f;
GetWindowDrawList()->AddRect(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(flWidth - flInset, flHeight - flInset), tColor2, H::Draw.Scale(4), ImDrawFlags_None, H::Draw.Scale());
}
@@ -2132,7 +2133,7 @@ void CMenu::MenuLogs(int iTab)
fStream.close();
SDK::SetClipboard(sString);
SDK::Output("Amalgam", "Copied playerlist to clipboard", DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Copied playerlist to clipboard", INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
}
@@ -2233,7 +2234,7 @@ void CMenu::MenuLogs(int iTab)
}
catch (...)
{
SDK::Output("Amalgam", "Failed to import playerlist", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Failed to import playerlist", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
}
@@ -2251,7 +2252,7 @@ void CMenu::MenuLogs(int iTab)
auto& iIDTo = mAs[i];
ImVec2 vOriginalPos = GetCursorPos();
PushStyleColor(ImGuiCol_Text, ColorToVec(vTags[i].m_tColor));
PushStyleColor(ImGuiCol_Text, ColorByteToInt(vTags[i].m_tColor));
SetCursorPos(vOriginalPos + ImVec2(H::Draw.Scale(8), H::Draw.Scale(5)));
FText(vTags[i].m_sName.c_str());
PopStyleColor();
@@ -2294,7 +2295,7 @@ void CMenu::MenuLogs(int iTab)
}
F::PlayerUtils.m_bSave = true;
SDK::Output("Amalgam", "Imported playerlist", DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Imported playerlist", INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
CloseCurrentPopup();
}
@@ -2325,11 +2326,11 @@ void CMenu::MenuLogs(int iTab)
F::Configs.m_sCorePath + std::format("Backup{}.json", iBackupCount + 1),
std::filesystem::copy_options::overwrite_existing
);
SDK::Output("Amalgam", "Saved backup playerlist", DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Saved backup playerlist", INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Failed to backup playerlist", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Failed to backup playerlist", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
}
}
@@ -2349,7 +2350,8 @@ void CMenu::MenuLogs(int iTab)
{
FDropdown(Vars::Logging::Logs);
FDropdown(Vars::Logging::NotificationPosition);
FSlider(Vars::Logging::Lifetime);
FSlider(Vars::Logging::NotificationTime);
FSlider(Vars::Logging::MaxNotifications);
} EndSection();
if (Section("Cheat Detection"))
{
@@ -2428,6 +2430,8 @@ void CMenu::MenuLogs(int iTab)
{
if (Section("##Output", false, GetWindowHeight() - GetStyle().WindowPadding.y * 2))
{
bool bClear = false;
for (auto& tOutput : m_vOutput)
{
ImVec2 vOriginalPos = GetCursorPos();
@@ -2441,7 +2445,7 @@ void CMenu::MenuLogs(int iTab)
auto vWrapped = WrapText(tOutput.m_sFunction, flWidth);
if (!vWrapped.empty())
{
PushStyleColor(ImGuiCol_Text, ColorToVec(tOutput.tAccent));
PushStyleColor(ImGuiCol_Text, ColorByteToInt(tOutput.tAccent));
for (auto& sText : vWrapped)
FText(sText.c_str());
@@ -2462,7 +2466,7 @@ void CMenu::MenuLogs(int iTab)
}
else
{
PushStyleColor(ImGuiCol_Text, ColorToVec(tOutput.tAccent));
PushStyleColor(ImGuiCol_Text, ColorByteToInt(tOutput.tAccent));
auto vWrapped = WrapText(tOutput.m_sLog, flWidth);
for (auto& sText : vWrapped)
@@ -2482,11 +2486,16 @@ void CMenu::MenuLogs(int iTab)
if (FSelectable("Copy"))
SDK::SetClipboard(std::format("{}{}{}", tOutput.m_sFunction, tOutput.m_sFunction != "" ? " " : "", tOutput.m_sLog));
if (FSelectable("Clear"))
bClear = true;
PopStyleVar();
EndPopup();
}
}
if (bClear)
m_vOutput.clear();
} EndSection();
break;
}
@@ -2934,7 +2943,7 @@ void CMenu::MenuSettings(int iTab)
ImColor tColor = F::Render.Background1p5L;
GetWindowDrawList()->AddRectFilled(vDrawPos, vDrawPos + ImVec2(flWidth, flHeight), tColor, H::Draw.Scale(4));
tColor = ColorToVec((VecToColor(F::Render.Background1p5)).Lerp({ 127, 127, 127 }, 1.f / 9, LerpEnum::NoAlpha));
tColor = ColorByteToFloat((ColorFloatToByte(F::Render.Background1p5)).Lerp({ 127, 127, 127 }, 1.f / 9, LerpEnum::NoAlpha));
float flInset = H::Draw.Scale(0.5f) - 0.5f;
GetWindowDrawList()->AddRect(vDrawPos + ImVec2(flInset, flInset), vDrawPos + ImVec2(flWidth - flInset, flHeight - flInset), tColor, H::Draw.Scale(4), ImDrawFlags_None, H::Draw.Scale());
}
@@ -4120,7 +4129,7 @@ void CMenu::Render()
{
using namespace ImGui;
if (!(ImGui::GetIO().DisplaySize.x > 160.f && ImGui::GetIO().DisplaySize.y > 28.f))
if (!(GetIO().DisplaySize.x > 160.f && GetIO().DisplaySize.y > 28.f))
return;
m_bInKeybind = false;
@@ -4154,25 +4163,26 @@ void CMenu::Render()
F::Render.Cursor = GetMouseCursor();
m_bWindowHovered = IsWindowHovered(ImGuiHoveredFlags_AnyWindow | ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem);
if (!vDisabled.empty())
if (!DisabledVec.empty())
{
IM_ASSERT_USER_ERROR(0, "Calling PopDisabled() too little times: stack overflow.");
Disabled = false;
vDisabled.clear();
DisabledVec.clear();
}
if (!vTransparent.empty())
if (!TransparentVec.empty())
{
IM_ASSERT_USER_ERROR(0, "Calling PopTransparent() too little times: stack overflow.");
Transparent = false;
vTransparent.clear();
TransparentVec.clear();
}
}
else
{
mActiveMap.clear();
ActiveMap.clear();
m_bWindowHovered = false;
}
DrawBinds();
F::Notifications.Draw();
PopFont();
}
@@ -0,0 +1,142 @@
#include "Notifications.h"
#include "../Easings/Easings.h"
#include "../Menu/Components.h"
#include <ImGui/imgui_internal.h>
#define EASE_IN Ease::OutCubic
#define EASE_OUT Ease::OutCubic
#define EASE_Y Ease::InOutCubic
void CNotifications::Add(const std::string& sText, const char* sIcon, Color_t tColor, float flLifeTime, float flPanTime)
{
float flTime = SDK::PlatFloatTime();
m_vNotifications.emplace_back(sText, sIcon, flTime, flLifeTime, flPanTime, tColor);
if (m_vNotifications.size() > Vars::Logging::MaxNotifications.Value)
{
for (int i = 0; i < m_vNotifications.size() - Vars::Logging::MaxNotifications.Value; i++)
{
auto& tNotification = m_vNotifications[i];
if (!tNotification.m_flLifeTime)
continue;
tNotification.m_flCreateTime = flTime - tNotification.m_flPanTime;
tNotification.m_flLifeTime = 0.f;
}
//m_vNotifications.pop_front();
}
}
void CNotifications::Add(const std::string& sText, Color_t tColor, float flLifeTime, float flPanTime)
{
Add(sText, nullptr, tColor, flLifeTime, flPanTime);
}
static inline bool ShouldReverseX()
{
switch (Vars::Logging::NotificationPosition.Value)
{
case Vars::Logging::NotificationPositionEnum::TopLeft:
case Vars::Logging::NotificationPositionEnum::BottomLeft:
return false;
case Vars::Logging::NotificationPositionEnum::TopRight:
case Vars::Logging::NotificationPositionEnum::BottomRight:
return true;
}
return false;
}
static inline bool ShouldReverseY()
{
switch (Vars::Logging::NotificationPosition.Value)
{
case Vars::Logging::NotificationPositionEnum::TopLeft:
case Vars::Logging::NotificationPositionEnum::TopRight:
return false;
case Vars::Logging::NotificationPositionEnum::BottomLeft:
case Vars::Logging::NotificationPositionEnum::BottomRight:
return true;
}
return false;
}
static inline int X()
{
return ShouldReverseX() ? -1 : 1;
}
static inline int Y()
{
return ShouldReverseY() ? -1 : 1;
}
void CNotifications::Draw()
{
using namespace ImGui;
for (auto it = m_vNotifications.begin(); it != m_vNotifications.end();)
{
if (it->m_flCreateTime + it->m_flLifeTime + it->m_flPanTime * 3 < SDK::PlatFloatTime())
it = m_vNotifications.erase(it);
else
++it;
}
if (m_vNotifications.empty())
return;
ImDrawList* pDrawList = GetForegroundDrawList();
float h = H::Draw.Scale(40);
float y = ShouldReverseY() ? GetIO().DisplaySize.y - H::Draw.Scale(8) - h : H::Draw.Scale(8);
for (auto& tNotification : m_vNotifications)
{
bool bIcon = tNotification.m_sIcon;
float w = CalcTextSize(tNotification.m_sText.c_str()).x + H::Draw.Scale(bIcon ? 54 : 30);
float x = ShouldReverseX() ? GetIO().DisplaySize.x - H::Draw.Scale(8) - w : H::Draw.Scale(8);
float flEaseX = 1.f, flEaseY = 1.f;
float flTime = SDK::PlatFloatTime();
float flCreate = tNotification.m_flCreateTime;
float flPan = tNotification.m_flPanTime;
float flLife = tNotification.m_flLifeTime + flPan * 2;
if (flPan)
{
if (float flDelta = flTime - flCreate; flDelta < flPan)
flEaseX = EASE_IN(Math::RemapVal(flDelta, 0.f, flPan, 0.f, 1.f));
else if (float flDelta = flCreate + flLife - flTime; flDelta < flPan)
flEaseX = EASE_OUT(Math::RemapVal(flDelta, 0.f, flPan, 0.f, 1.f));
if (float flDelta = flCreate + flLife + flPan - flTime; flDelta < flPan)
flEaseY = EASE_Y(Math::RemapVal(flDelta, 0.f, flPan, 0.f, 1.f));
}
flLife = Math::RemapVal(flCreate + flLife - flPan - flTime, 0.f, flLife, 0.f, 1.f);
x -= (w + H::Draw.Scale(8)) * (1.f - flEaseX) * X();
ImU32 uBackground = F::Render.Background0;
ImU32 uBorder = F::Render.Background2;
ImU32 uActive = F::Render.Active;
ImU32 uAccentOpaque = ColorByteToInt(tNotification.m_tColor.Alpha(255));
ImU32 uAccentTransparent = ColorByteToInt(tNotification.m_tColor.Alpha(50));
ImVec2 vDrawPos = { x, y };
ImVec2 vSize = { w, h };
float flInset = H::Draw.Scale();
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + vSize - ImVec2(flInset, flInset), uBackground, H::Draw.Scale(3));
pDrawList->PushClipRect(vDrawPos + ImVec2(flInset, h - flInset - H::Draw.Scale(2)), vDrawPos + ImVec2(w - flInset, h - flInset), false);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + vSize - ImVec2(flInset, flInset), uAccentTransparent, H::Draw.Scale(3));
pDrawList->PopClipRect();
pDrawList->PushClipRect(vDrawPos + ImVec2(flInset, h - flInset - H::Draw.Scale(2)), vDrawPos + ImVec2((w - flInset) * flLife, h - flInset), false);
pDrawList->AddRectFilled(vDrawPos + ImVec2(flInset, flInset), vDrawPos + vSize - ImVec2(flInset, flInset), uAccentOpaque, H::Draw.Scale(3));
pDrawList->PopClipRect();
flInset += H::Draw.Scale(0.5f) - 0.5f - H::Draw.Scale();
pDrawList->AddRect(vDrawPos + ImVec2(flInset, flInset), vDrawPos + vSize - ImVec2(flInset, flInset), uBorder, H::Draw.Scale(4), ImDrawFlags_None, H::Draw.Scale());
if (!bIcon)
pDrawList->AddText(vDrawPos + ImVec2(H::Draw.Scale(15), H::Draw.Scale(13)), uActive, tNotification.m_sText.c_str());
else
{
pDrawList->AddText(vDrawPos + ImVec2(H::Draw.Scale(39), H::Draw.Scale(13)), uActive, tNotification.m_sText.c_str());
pDrawList->AddText(F::Render.IconFont, F::Render.IconFont->LegacySize, vDrawPos + ImVec2(H::Draw.Scale(12), H::Draw.Scale(12)), uAccentOpaque, tNotification.m_sIcon);
}
y += (h + H::Draw.Scale(8, Scale_Round)) * (flEaseY) * Y();
}
}
@@ -0,0 +1,26 @@
#pragma once
#include "../../../SDK/SDK.h"
struct Notification_t
{
std::string m_sText = "";
const char* m_sIcon = nullptr;
float m_flCreateTime = 0.f;
float m_flLifeTime = 0.f;
float m_flPanTime = 0.f;
Color_t m_tColor = {};
};
class CNotifications
{
private:
std::deque<Notification_t> m_vNotifications;
public:
void Add(const std::string& sText, const char* sIcon, Color_t tColor = Vars::Menu::Theme::Accent.Value, float flLifeTime = Vars::Logging::NotificationTime.Value, float flPanTime = 0.2f);
void Add(const std::string& sText, Color_t tColor = Vars::Menu::Theme::Accent.Value, float flLifeTime = Vars::Logging::NotificationTime.Value, float flPanTime = 0.2f);
void Draw();
};
ADD_FEATURE(CNotifications, Notifications);
+17 -15
View File
@@ -8,6 +8,7 @@
#include "Fonts/Roboto/RobotoMedium.h"
#include "Fonts/Roboto/RobotoBlack.h"
#include "Menu/Menu.h"
#include "Menu/Components.h"
void CRender::Render(IDirect3DDevice9* pDevice)
{
@@ -41,22 +42,19 @@ void CRender::Render(IDirect3DDevice9* pDevice)
void CRender::LoadColors()
{
auto fColorToVec = [](Color_t tColor) -> ImColor
{
return { tColor.r / 255.f, tColor.g / 255.f, tColor.b / 255.f, tColor.a / 255.f };
};
using namespace ImGui;
Accent = fColorToVec(Vars::Menu::Theme::Accent.Value);
Background0 = fColorToVec(Vars::Menu::Theme::Background.Value);
Background0p5 = fColorToVec(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 0.5f / 9, LerpEnum::NoAlpha));
Background1 = fColorToVec(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 1.f / 9, LerpEnum::NoAlpha));
Background1p5 = fColorToVec(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 1.5f / 9, LerpEnum::NoAlpha));
Accent = ColorByteToFloat(Vars::Menu::Theme::Accent.Value);
Background0 = ColorByteToFloat(Vars::Menu::Theme::Background.Value);
Background0p5 = ColorByteToFloat(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 0.5f / 9, LerpEnum::NoAlpha));
Background1 = ColorByteToFloat(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 1.f / 9, LerpEnum::NoAlpha));
Background1p5 = ColorByteToFloat(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 1.5f / 9, LerpEnum::NoAlpha));
Background1p5L = { Background1p5.Value.x * 1.1f, Background1p5.Value.y * 1.1f, Background1p5.Value.z * 1.1f, Background1p5.Value.w };
Background2 = fColorToVec(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 2.f / 9, LerpEnum::NoAlpha));
Inactive = fColorToVec(Vars::Menu::Theme::Inactive.Value);
Active = fColorToVec(Vars::Menu::Theme::Active.Value);
Background2 = ColorByteToFloat(Vars::Menu::Theme::Background.Value.Lerp({ 127, 127, 127 }, 2.f / 9, LerpEnum::NoAlpha));
Inactive = ColorByteToFloat(Vars::Menu::Theme::Inactive.Value);
Active = ColorByteToFloat(Vars::Menu::Theme::Active.Value);
ImVec4* colors = ImGui::GetStyle().Colors;
ImVec4* colors = GetStyle().Colors;
colors[ImGuiCol_Border] = Background2;
colors[ImGuiCol_Button] = {};
colors[ImGuiCol_ButtonHovered] = {};
@@ -79,7 +77,9 @@ void CRender::LoadColors()
void CRender::LoadFonts()
{
auto& io = ImGui::GetIO();
using namespace ImGui;
auto& io = GetIO();
if (static bool bLoaded = false; !bLoaded)
bLoaded = true;
@@ -112,7 +112,9 @@ void CRender::LoadFonts()
void CRender::LoadStyle()
{
auto& style = ImGui::GetStyle();
using namespace ImGui;
auto& style = GetStyle();
style.ButtonTextAlign = { 0.5f, 0.5f };
style.CellPadding = { H::Draw.Scale(4), 0 };
style.ChildBorderSize = 0.f;
+39 -23
View File
@@ -1,25 +1,27 @@
#include "Output.h"
#include "../Visuals/Notifications/Notifications.h"
#include "../ImGui/Notifications/Notifications.h"
#include "../Players/PlayerUtils.h"
static std::string s_sRed = Color_t(255, 100, 100).ToHex();
static std::string s_sGreen = Color_t(100, 255, 100).ToHex();
static std::string s_sYellow = Color_t(200, 169, 0).ToHex();
static inline void OutputInfo(int iFlags, const char* sName, const char* sOutput, const char* sColor)
static inline void OutputInfo(int iFlags, const char* sName,
const char* sOutput, const char* sColor,
const char* sIcon = nullptr, Color_t tColor = Vars::Menu::Theme::Accent.Value)
{
int iTo = (iFlags & Vars::Logging::LogToEnum::Console ? OUTPUT_CONSOLE : 0)
| (iFlags & Vars::Logging::LogToEnum::Debug ? OUTPUT_DEBUG : 0)
| (iFlags & Vars::Logging::LogToEnum::Toasts ? OUTPUT_TOAST : 0)
| (iFlags & Vars::Logging::LogToEnum::Menu ? OUTPUT_MENU : 0)
| (iFlags & Vars::Logging::LogToEnum::Party ? OUTPUT_PARTY : 0);
if (iTo)
SDK::Output(sName, sOutput, Vars::Menu::Theme::Accent.Value, iTo);
int iTo;
iTo = (iFlags & Vars::Logging::LogToEnum::Chat ? OUTPUT_CHAT : 0);
if (iTo)
SDK::Output(Vars::Menu::CheatTag.Value.c_str(), sColor, Vars::Menu::Theme::Accent.Value, iTo, -1, "", "");
if (iTo = (iFlags & Vars::Logging::LogToEnum::Toasts ? OUTPUT_TOAST : 0)
| (iFlags & Vars::Logging::LogToEnum::Party ? OUTPUT_PARTY : 0)
| (iFlags & Vars::Logging::LogToEnum::Console ? OUTPUT_CONSOLE : 0)
| (iFlags & Vars::Logging::LogToEnum::Menu ? OUTPUT_MENU : 0)
| (iFlags & Vars::Logging::LogToEnum::Debug ? OUTPUT_DEBUG : 0))
SDK::Output(sName, sOutput, tColor, iTo, sIcon);
if (iTo = (iFlags & Vars::Logging::LogToEnum::Chat ? OUTPUT_CHAT : 0))
SDK::Output(Vars::Menu::CheatTag.Value.c_str(), sColor, tColor, iTo, nullptr, MB_NONE, "", "");
}
// Event info
@@ -55,7 +57,8 @@ void COutput::Event(IGameEvent* pEvent, uint32_t uHash, CTFPlayer* pLocal)
bool bSameTeam = pEntity->As<CTFPlayer>()->m_iTeamNum() == pLocal->m_iTeamNum();
OutputInfo(Vars::Logging::VoteCast::LogTo.Value, "Vote Cast",
std::format("{}{} voted {}", (bSameTeam ? "" : "[Enemy] "), (sName), (bVotedYes ? "Yes" : "No")).c_str(),
std::format("{}{}{}\x1 voted {}{}", (bSameTeam ? "" : "[Enemy] "), (s_sYellow), (sName), (bVotedYes ? s_sGreen : s_sRed), (bVotedYes ? "Yes" : "No")).c_str()
std::format("{}{}{}\x1 voted {}{}", (bSameTeam ? "" : "[Enemy] "), (s_sYellow), (sName), (bVotedYes ? s_sGreen : s_sRed), (bVotedYes ? "Yes" : "No")).c_str(),
ICON_MD_HOW_TO_VOTE
);
return;
@@ -78,7 +81,8 @@ void COutput::Event(IGameEvent* pEvent, uint32_t uHash, CTFPlayer* pLocal)
bool bSameTeam = pEntity->As<CTFPlayer>()->m_iTeamNum() == pLocal->m_iTeamNum();
OutputInfo(Vars::Logging::ClassChange::LogTo.Value, "Class Change",
std::format("{}{} changed class to {}", (bSameTeam ? "" : "[Enemy] "), (sName), (SDK::GetClassByIndex(pEvent->GetInt("class")))).c_str(),
std::format("{}{}{}\x1 changed class to {}{}", (bSameTeam ? "" : "[Enemy] "), (s_sYellow), (sName), (s_sYellow), (SDK::GetClassByIndex(pEvent->GetInt("class")))).c_str()
std::format("{}{}{}\x1 changed class to {}{}", (bSameTeam ? "" : "[Enemy] "), (s_sYellow), (sName), (s_sYellow), (SDK::GetClassByIndex(pEvent->GetInt("class")))).c_str(),
ICON_MD_INFO
);
return;
@@ -110,7 +114,8 @@ void COutput::Event(IGameEvent* pEvent, uint32_t uHash, CTFPlayer* pLocal)
auto sName = F::PlayerUtils.GetPlayerName(iIndex, pResource->GetName(iIndex));
OutputInfo(Vars::Logging::Damage::LogTo.Value, "Damage",
std::format("Hit {} for {} damage ({} / {}{})", (sName), (nDamage), (nHealth), (iMaxHealth), (bCrit ? ", crit" : bMinicrit ? ", minicrit" : "")).c_str(),
std::format("Hit {}{}\x1 for {}{} damage{} ({} / {}{})", (s_sYellow), (sName), (s_sRed), (nDamage), (s_sYellow), (nHealth), (iMaxHealth), (bCrit ? ", crit" : bMinicrit ? ", minicrit" : "")).c_str()
std::format("Hit {}{}\x1 for {}{} damage{} ({} / {}{})", (s_sYellow), (sName), (s_sRed), (nDamage), (s_sYellow), (nHealth), (iMaxHealth), (bCrit ? ", crit" : bMinicrit ? ", minicrit" : "")).c_str(),
ICON_MD_INFO
);
return;
@@ -190,7 +195,8 @@ void COutput::UserMessage(bf_read& msgData)
}
OutputInfo(Vars::Logging::VoteStart::LogTo.Value, "Vote Start",
std::format("{}{} called a vote on {} ({})", (bSameTeam ? "" : "[Enemy] "), (sCallerName), (sTargetName), (sReason)).c_str(),
std::format("{}{}{}\x1 called a vote on {}{}\x1 ({})", (bSameTeam ? "" : "[Enemy] "), (s_sYellow), (sCallerName), (s_sYellow), (sTargetName), (sReason)).c_str()
std::format("{}{}{}\x1 called a vote on {}{}\x1 ({})", (bSameTeam ? "" : "[Enemy] "), (s_sYellow), (sCallerName), (s_sYellow), (sTargetName), (sReason)).c_str(),
ICON_MD_BALLOT
);
}
@@ -212,7 +218,8 @@ void COutput::CheatDetection(const char* sName, const char* sAction, const char*
OutputInfo(Vars::Logging::CheatDetection::LogTo.Value, "Cheat Detection",
std::format("{} {} for {}", (sName), (sAction), (sReason)).c_str(),
std::format("{}{}\x1 {} for {}{}", (s_sYellow), (sName), (sAction), (s_sYellow), (sReason)).c_str()
std::format("{}{}\x1 {} for {}{}", (s_sYellow), (sName), (sAction), (s_sYellow), (sReason)).c_str(),
ICON_MD_INFO, F::PlayerUtils.m_vTags[F::PlayerUtils.TagToIndex(CHEATER_TAG)].m_tColor
);
}
@@ -300,7 +307,8 @@ void COutput::TagsOnJoin(const char* sName, uint32_t uAccountID)
OutputInfo(Vars::Logging::Tags::LogTo.Value, "Tags",
std::format("{} has the {} {}", (sName), (vColorsTags.size() == 1 ? "tag" : "tags"), (sOutputText)).c_str(),
std::format("{}{}\x1 has the {} {}", (s_sYellow), (sName), (vColorsTags.size() == 1 ? "tag" : "tags"), (sChatText)).c_str()
std::format("{}{}\x1 has the {} {}", (s_sYellow), (sName), (vColorsTags.size() == 1 ? "tag" : "tags"), (sChatText)).c_str(),
ICON_MD_INFO, INFO_COLOR
);
}
void COutput::TagsChanged(const char* sName, const char* sAction, const char* sColor, const char* sTag)
@@ -311,7 +319,8 @@ void COutput::TagsChanged(const char* sName, const char* sAction, const char* sC
auto uHash = FNV1A::Hash32(sAction);
OutputInfo(Vars::Logging::Tags::LogTo.Value, "Tags",
std::format("{} tag {} {} {}", (sAction), (sTag), (uHash == FNV1A::Hash32Const("Added") ? "to" : "from"), (sName)).c_str(),
std::format("{} tag {}{}\x1 {} {}{}", (sAction), (sColor), (sTag), (uHash == FNV1A::Hash32Const("Added") ? "to" : "from"), (s_sYellow), (sName)).c_str()
std::format("{} tag {}{}\x1 {} {}{}", (sAction), (sColor), (sTag), (uHash == FNV1A::Hash32Const("Added") ? "to" : "from"), (s_sYellow), (sName)).c_str(),
ICON_MD_INFO, INFO_COLOR
);
}
@@ -328,7 +337,8 @@ void COutput::AliasOnJoin(const char* sName, uint32_t uAccountID)
OutputInfo(Vars::Logging::Tags::LogTo.Value, "Aliases",
std::format("{} has the alias \"{}\"", (sName), (sAlias)).c_str(),
std::format("{}{}\x1 has the alias \"{}{}\x1\"", (s_sYellow), (sName), (s_sYellow), (sAlias)).c_str()
std::format("{}{}\x1 has the alias \"{}{}\x1\"", (s_sYellow), (sName), (s_sYellow), (sAlias)).c_str(),
ICON_MD_INFO, INFO_COLOR
);
}
void COutput::AliasChanged(const char* sName, const char* sAction, const char* sAlias)
@@ -339,7 +349,8 @@ void COutput::AliasChanged(const char* sName, const char* sAction, const char* s
auto uHash = FNV1A::Hash32(sAction);
OutputInfo(Vars::Logging::Tags::LogTo.Value, "Aliases",
std::format("{} {}'s alias {} \"{}\"", (sAction), (sName), (uHash == FNV1A::Hash32Const("Changed") ? "to" : "of"), (sAlias)).c_str(),
std::format("{} {}{}\x1's alias {} \"{}{}\x1\"", (sAction), (s_sYellow), (sName), (uHash == FNV1A::Hash32Const("Changed") ? "to" : "of"), (s_sYellow), (sAlias)).c_str()
std::format("{} {}{}\x1's alias {} \"{}{}\x1\"", (sAction), (s_sYellow), (sName), (uHash == FNV1A::Hash32Const("Changed") ? "to" : "of"), (s_sYellow), (sAlias)).c_str(),
ICON_MD_INFO, INFO_COLOR
);
}
@@ -363,7 +374,8 @@ void COutput::ReportResolver(int iIndex, const char* sAction, const char* sAxis,
auto sName = F::PlayerUtils.GetPlayerName(iIndex, pResource->GetName(iIndex));
OutputInfo(Vars::Logging::Tags::LogTo.Value, "Resolver",
std::format("{} {} of {} to {}", (sAction), (sAxis), (sName), (sValue)).c_str(),
std::format("{} {}{}\x1 of {}{}\x1 to {}{}\x1", (sAction), (s_sYellow), (sAxis), (s_sYellow), (sName), (s_sYellow), (sValue)).c_str()
std::format("{} {}{}\x1 of {}{}\x1 to {}{}\x1", (sAction), (s_sYellow), (sAxis), (s_sYellow), (sName), (s_sYellow), (sValue)).c_str(),
ICON_MD_INFO
);
}
void COutput::ReportResolver(const char* sMessage)
@@ -371,5 +383,9 @@ void COutput::ReportResolver(const char* sMessage)
if (!(Vars::Logging::Logs.Value & Vars::Logging::LogsEnum::Resolver))
return;
OutputInfo(Vars::Logging::Tags::LogTo.Value, "Resolver", sMessage, sMessage);
OutputInfo(Vars::Logging::Tags::LogTo.Value, "Resolver",
sMessage,
sMessage,
ICON_MD_INFO
);
}
+7 -7
View File
@@ -74,11 +74,11 @@ void CPlayerlistCore::SavePlayerlist()
write_json(F::Configs.m_sCorePath + "Players.json", tWrite);
SDK::Output("Amalgam", "Saved playerlist", DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Saved playerlist", INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Save playerlist failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Save playerlist failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
}
@@ -132,7 +132,7 @@ void CPlayerlistCore::LoadPlayerlist()
}
}
else
SDK::Output("Amalgam", "Playerlist config not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Playerlist config not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
if (auto tSub = tRead.get_child_optional("Tags"))
{
@@ -154,7 +154,7 @@ void CPlayerlistCore::LoadPlayerlist()
}
}
else
SDK::Output("Amalgam", "Playerlist tags not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Playerlist tags not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
if (auto tSub = tRead.get_child_optional("Aliases"))
{
@@ -168,13 +168,13 @@ void CPlayerlistCore::LoadPlayerlist()
}
}
else
SDK::Output("Amalgam", "Playerlist aliases not found", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Playerlist aliases not found", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
SDK::Output("Amalgam", "Loaded playerlist", DEFAULT_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Loaded playerlist", INFO_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_INFO);
}
catch (...)
{
SDK::Output("Amalgam", "Load playerlist failed", ALTERNATE_COLOR, OUTPUT_CONSOLE | OUTPUT_MENU | OUTPUT_DEBUG);
SDK::Output("Amalgam", "Load playerlist failed", ERROR_COLOR, OUTPUT_CONSOLE | OUTPUT_TOAST | OUTPUT_MENU | OUTPUT_DEBUG, ICON_MD_CANCEL);
}
F::PlayerUtils.m_bLoad = false;
@@ -1,98 +0,0 @@
#include "Notifications.h"
static inline float EaseInOutCubic(float x)
{
return x < 0.5f ? 4 * powf(x, 3) : 1 - powf(-2 * x + 2, 3) / 2;
}
void CNotifications::Add(const std::string& sText, Color_t tColor, float flLifeTime, float flPanTime)
{
m_vNotifications.emplace_back(sText, float(SDK::PlatFloatTime()), flLifeTime, flPanTime, tColor);
while (m_vNotifications.size() > m_iMaxNotifySize)
m_vNotifications.pop_front();
}
static inline bool ShouldReverseX()
{
switch (Vars::Logging::NotificationPosition.Value)
{
case Vars::Logging::NotificationPositionEnum::TopLeft:
case Vars::Logging::NotificationPositionEnum::BottomLeft:
return false;
case Vars::Logging::NotificationPositionEnum::TopRight:
case Vars::Logging::NotificationPositionEnum::BottomRight:
return true;
}
return false;
}
static inline bool ShouldReverseY()
{
switch (Vars::Logging::NotificationPosition.Value)
{
case Vars::Logging::NotificationPositionEnum::TopLeft:
case Vars::Logging::NotificationPositionEnum::TopRight:
return false;
case Vars::Logging::NotificationPositionEnum::BottomLeft:
case Vars::Logging::NotificationPositionEnum::BottomRight:
return true;
}
return false;
}
void CNotifications::Draw()
{
for (auto it = m_vNotifications.begin(); it != m_vNotifications.end();)
{
if (it->m_flCreateTime + it->m_flLifeTime + it->m_flPanTime < SDK::PlatFloatTime())
it = m_vNotifications.erase(it);
else
++it;
}
if (m_vNotifications.empty())
return;
const auto& fFont = H::Fonts.GetFont(FONT_INDICATORS);
int h = H::Draw.Scale(40, Scale_Round);
int y = !ShouldReverseY() ? H::Draw.Scale(8, Scale_Round) : H::Draw.m_nScreenH - H::Draw.Scale(8, Scale_Round) - h;
for (auto& tNotification : m_vNotifications)
{
int w = H::Draw.GetTextSize(tNotification.m_sText.c_str(), fFont).x + H::Draw.Scale(30, Scale_Round);
int x = !ShouldReverseX() ? H::Draw.Scale(8, Scale_Round) : H::Draw.m_nScreenW - H::Draw.Scale(8, Scale_Round) - w;
float flEaseX = 1.f, flEaseY = 1.f;
float flTime = SDK::PlatFloatTime();
float flCreate = tNotification.m_flCreateTime;
float flLife = tNotification.m_flLifeTime;
float flPan = tNotification.m_flPanTime;
if (flPan)
{
float flDelta = std::min(flTime - flCreate, flCreate + flLife - flTime);
if (flDelta < flPan)
flEaseX = EaseInOutCubic(Math::RemapVal(flDelta, 0.f, flPan, 0.f, 1.f));
flDelta = flCreate + flLife + flPan - flTime;
if (flDelta < flPan)
flEaseY = EaseInOutCubic(Math::RemapVal(flDelta, 0.f, flPan, 0.f, 1.f));
}
flLife = Math::RemapVal(flCreate + flLife - flPan - flTime, 0.f, flLife, 0.f, 1.f);
x -= (w + H::Draw.Scale(8, Scale_Round)) * (1.f - flEaseX) * (!ShouldReverseX() ? 1 : -1);
Color_t tAccent = tNotification.m_tColor;
Color_t tBackground = Vars::Menu::Theme::Background.Value;
Color_t tActive = Vars::Menu::Theme::Active.Value;
H::Draw.FillRoundRect(x + 1, y + 1, w - 2, h - 2, H::Draw.Scale(3, Scale_Round), tBackground, 16);
H::Draw.StartClipping(x + 1, y + h - 1 - H::Draw.Scale(2, Scale_Round), w - 2, H::Draw.Scale(2, Scale_Round));
H::Draw.FillRoundRect(x + 1, y + 1, w - 2, h - 2, H::Draw.Scale(3, Scale_Round), tAccent.Alpha(50), 16);
H::Draw.StartClipping(x + 1, y + h - 1 - H::Draw.Scale(2, Scale_Round), (w - 2) * flLife, H::Draw.Scale(2, Scale_Round));
H::Draw.FillRoundRect(x + 1, y + 1, w - 2, h - 2, H::Draw.Scale(3, Scale_Round), tAccent.Alpha(255), 16);
H::Draw.EndClipping();
H::Draw.LineRoundRect(x, y, w, h, H::Draw.Scale(4, Scale_Round), tBackground.Lerp({ 127, 127, 127 }, 2.f / 9), 16);
H::Draw.StringOutlined(fFont, x + H::Draw.Scale(15, Scale_Round), y + H::Draw.Scale(13, Scale_Round), tActive.Alpha(255), Vars::Menu::Theme::Background.Value, ALIGN_TOPLEFT, tNotification.m_sText.c_str());
y += (h + H::Draw.Scale(8, Scale_Round)) * (flEaseY) * (!ShouldReverseY() ? 1 : -1);
}
}
@@ -1,25 +0,0 @@
#pragma once
#include "../../../SDK/SDK.h"
struct Notification_t
{
std::string m_sText;
float m_flCreateTime;
float m_flLifeTime;
float m_flPanTime;
Color_t m_tColor;
};
class CNotifications
{
private:
std::deque<Notification_t> m_vNotifications;
size_t m_iMaxNotifySize = 10;
public:
void Add(const std::string& sText, Color_t tColor = Vars::Menu::Theme::Accent.Value, float flLifeTime = Vars::Logging::Lifetime.Value, float flPanTime = 0.2f);
void Draw();
};
ADD_FEATURE(CNotifications, Notifications);
+5 -13
View File
@@ -1,6 +1,5 @@
#include "../SDK/SDK.h"
#include "../Features/Visuals/Notifications/Notifications.h"
#include "../Features/Visuals/ESP/ESP.h"
#include "../Features/Visuals/OffscreenArrows/OffscreenArrows.h"
#include "../Features/Visuals/CameraWindow/CameraWindow.h"
@@ -24,7 +23,11 @@ MAKE_HOOK(IEngineVGui_Paint, U::Memory.GetVirtual(I::EngineVGui, 14), void,
if (G::Unload)
return CALL_ORIGINAL(rcx, iMode);
if (iMode & PAINT_INGAMEPANELS && !SDK::CleanScreenshot())
if (iMode & PAINT_UIPANELS)
{
H::Draw.UpdateKeyStrings();
}
else if (iMode & PAINT_INGAMEPANELS && !SDK::CleanScreenshot())
{
H::Draw.UpdateScreenSize();
H::Draw.UpdateW2SMatrix();
@@ -59,15 +62,4 @@ MAKE_HOOK(IEngineVGui_Paint, U::Memory.GetVirtual(I::EngineVGui, 14), void,
CALL_ORIGINAL(rcx, iMode);
if (iMode & PAINT_UIPANELS && !SDK::CleanScreenshot())
{
H::Draw.UpdateScreenSize();
H::Draw.UpdateKeyStrings();
H::Draw.Start();
{
F::Notifications.Draw();
}
H::Draw.End();
}
}
+4 -4
View File
@@ -1,6 +1,6 @@
#include "SDK.h"
#include "../Features/Visuals/Notifications/Notifications.h"
#include "../Features/ImGui/Notifications/Notifications.h"
#include "../Features/ImGui/Menu/Menu.h"
#include "../Features/EnginePrediction/EnginePrediction.h"
@@ -33,7 +33,7 @@ static BOOL CALLBACK TeamFortressWindow(HWND hWindow, LPARAM lParam)
void SDK::Output(const char* sFunction, const char* sLog, Color_t tColor,
int iTo, int iMessageBox,
int iTo, const char* sIcon, int iMessageBox,
const char* sLeft, const char* sRight)
{
if (sLog)
@@ -46,7 +46,7 @@ void SDK::Output(const char* sFunction, const char* sLog, Color_t tColor,
if (iTo & OUTPUT_DEBUG)
OutputDebugString(std::format("{}{}{} {}\n", sLeft, sFunction, sRight, sLog).c_str());
if (iTo & OUTPUT_TOAST)
F::Notifications.Add(sLog, tColor);
F::Notifications.Add(sLog, sIcon, tColor);
if (iTo & OUTPUT_MENU)
F::Menu.AddOutput(std::format("{}{}{}", sLeft, sFunction, sRight).c_str(), sLog, tColor);
if (iTo & OUTPUT_CHAT)
@@ -63,7 +63,7 @@ void SDK::Output(const char* sFunction, const char* sLog, Color_t tColor,
if (iTo & OUTPUT_DEBUG)
OutputDebugString(std::format("{}\n", sFunction).c_str());
if (iTo & OUTPUT_TOAST)
F::Notifications.Add(sFunction, tColor);
F::Notifications.Add(sFunction, sIcon, tColor);
if (iTo & OUTPUT_MENU)
F::Menu.AddOutput("", sFunction, tColor);
if (iTo & OUTPUT_CHAT)
+53 -46
View File
@@ -19,61 +19,68 @@
#include "../Utils/Math/Math.h"
#include "../Utils/Timer/Timer.h"
#include "../Utils/Macros/Macros.h"
#include "../Features/ImGui/Fonts/MaterialDesign/IconDefinitions.h"
#include <intrin.h>
#include <random>
#define VK_0 0x30
#define VK_1 0x31
#define VK_2 0x32
#define VK_3 0x33
#define VK_4 0x34
#define VK_5 0x35
#define VK_6 0x36
#define VK_7 0x37
#define VK_8 0x38
#define VK_9 0x39
#define VK_A 0x41
#define VK_B 0x42
#define VK_C 0x43
#define VK_D 0x44
#define VK_E 0x45
#define VK_F 0x46
#define VK_G 0x47
#define VK_H 0x48
#define VK_I 0x49
#define VK_J 0x4A
#define VK_K 0x4B
#define VK_L 0x4C
#define VK_M 0x4D
#define VK_N 0x4E
#define VK_O 0x4F
#define VK_P 0x50
#define VK_Q 0x51
#define VK_R 0x52
#define VK_S 0x53
#define VK_T 0x54
#define VK_U 0x55
#define VK_V 0x56
#define VK_W 0x57
#define VK_X 0x58
#define VK_Y 0x59
#define VK_Z 0x5A
#define OUTPUT_NONE 0
#define OUTPUT_CONSOLE 1 << 0
#define OUTPUT_DEBUG 1 << 1
#define OUTPUT_TOAST 1 << 2
#define OUTPUT_MENU 1 << 3
#define OUTPUT_CHAT 1 << 4
#define OUTPUT_PARTY 1 << 5
#define MB_NONE -1
#define DEFAULT_COLOR Color_t(175, 150, 255, 255)
#define ALTERNATE_COLOR Color_t(175, 150, 255, 127)
#define VK_0 0x30
#define VK_1 0x31
#define VK_2 0x32
#define VK_3 0x33
#define VK_4 0x34
#define VK_5 0x35
#define VK_6 0x36
#define VK_7 0x37
#define VK_8 0x38
#define VK_9 0x39
#define VK_A 0x41
#define VK_B 0x42
#define VK_C 0x43
#define VK_D 0x44
#define VK_E 0x45
#define VK_F 0x46
#define VK_G 0x47
#define VK_H 0x48
#define VK_I 0x49
#define VK_J 0x4A
#define VK_K 0x4B
#define VK_L 0x4C
#define VK_M 0x4D
#define VK_N 0x4E
#define VK_O 0x4F
#define VK_P 0x50
#define VK_Q 0x51
#define VK_R 0x52
#define VK_S 0x53
#define VK_T 0x54
#define VK_U 0x55
#define VK_V 0x56
#define VK_W 0x57
#define VK_X 0x58
#define VK_Y 0x59
#define VK_Z 0x5A
#define OUTPUT_NONE 0
#define OUTPUT_CONSOLE 1 << 0
#define OUTPUT_DEBUG 1 << 1
#define OUTPUT_TOAST 1 << 2
#define OUTPUT_MENU 1 << 3
#define OUTPUT_CHAT 1 << 4
#define OUTPUT_PARTY 1 << 5
#define SUCCESS_COLOR Color_t(50, 255, 100, 255)
#define WARNING_COLOR Color_t(255, 200, 0, 255)
#define ERROR_COLOR Color_t(255, 50, 50, 255)
#define INFO_COLOR Color_t(50, 150, 255, 255)
namespace SDK
{
void Output(const char* sFunction, const char* sLog = nullptr, Color_t tColor = { 255, 255, 255, 255 },
int iTo = OUTPUT_CONSOLE, int iMessageBox = -1,
int iTo = OUTPUT_CONSOLE, const char* sIcon = nullptr, int iMessageBox = MB_NONE,
const char* sLeft = "[", const char* sRight = "]");
void SetClipboard(const std::string& sString);
+2 -1
View File
@@ -833,7 +833,8 @@ NAMESPACE_BEGIN(Vars)
CVarEnum(NotificationPosition, "Notification position", 0, VISUAL, nullptr,
VA_LIST("Top left", "Top right", "Bottom left", "Bottom right"),
TopLeft, TopRight, BottomLeft, BottomRight);
CVar(Lifetime, "Notification time", 5.f, VISUAL, 0.5f, 5.f, 0.5f);
CVar(NotificationTime, "Notification time", 5.f, VISUAL, 0.5f, 5.f, 0.5f);
CVar(MaxNotifications, "Max notifications", 10, VISUAL | SLIDER_MIN, 1, 10);
NAMESPACE_BEGIN(VoteStart, Logging)
CVarValues(LogTo, "Vote start log to", 0b000001, DROPDOWN_MULTI, nullptr,
@@ -175,7 +175,7 @@ static LONG APIENTRY ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo)
case STATUS_ACCESS_VIOLATION:
case STATUS_STACK_OVERFLOW:
case STATUS_HEAP_CORRUPTION:
SDK::Output("Unhandled exception", ssErrorStream.str().c_str(), {}, OUTPUT_DEBUG, MB_OK | MB_ICONERROR);
SDK::Output("Unhandled exception", ssErrorStream.str().c_str(), {}, OUTPUT_DEBUG, nullptr, MB_OK | MB_ICONERROR);
}
return EXCEPTION_CONTINUE_SEARCH;