Release v1.4.0.0

Template system, advanced boon settings, and icon visibility control

- Save/load/delete custom templates with boon, golem, and condition settings (saved to addons/GolemHelper/templates.cfg) and real-time current template display
- QuickLoad buttons: DPS, Quick DPS, Alac DPS, qHeal, aHeal for instant switching
- Advanced boon settings: Add Resistance/Stability options (now all boons are covered; disabled in healer mode)
- Always Hide Icon setting to permanently hide QuickAccess icon
- Removed redundant checkboxes
This commit is contained in:
Azrub 2025-08-03 01:45:01 +02:00
parent 47839c1915
commit 366f3f4918
11 changed files with 802 additions and 194 deletions

View file

@ -33,7 +33,7 @@ bool AutomationLogic::ShouldSkipGolemStep(int stepIndex) {
} }
void AutomationLogic::ApplyHealerBoons() { void AutomationLogic::ApplyHealerBoons() {
if (!g_api || !g_state.boonsEnabled || !g_state.enabled) return; if (!g_api || !g_state.enabled) return;
bool uiWasVisible = g_state.showUI; bool uiWasVisible = g_state.showUI;
if (uiWasVisible) { if (uiWasVisible) {
@ -99,7 +99,7 @@ void AutomationLogic::ApplyHealerBoons() {
} }
void AutomationLogic::ApplyAllBoons() { void AutomationLogic::ApplyAllBoons() {
if (!g_api || !g_state.boonsEnabled || !g_state.enabled) return; if (!g_api || !g_state.enabled) return;
if (g_state.environmentDamage) { if (g_state.environmentDamage) {
ApplyHealerBoons(); ApplyHealerBoons();
@ -119,8 +119,16 @@ void AutomationLogic::ApplyAllBoons() {
mode = "Alac DPS"; mode = "Alac DPS";
} }
std::string advancedBoons = "";
if (g_state.showBoonAdvanced && (g_state.addResistance || g_state.addStability)) {
advancedBoons = " + ";
if (g_state.addResistance) advancedBoons += "Resistance ";
if (g_state.addStability) advancedBoons += "Stability ";
advancedBoons.pop_back();
}
char startBuffer[300]; char startBuffer[300];
sprintf_s(startBuffer, "Starting boon sequence (20 steps) - Mode: %s", mode.c_str()); sprintf_s(startBuffer, "Starting boon sequence (20 steps) - Mode: %s%s", mode.c_str(), advancedBoons.c_str());
g_api->Log(ELogLevel_INFO, "GolemHelper", startBuffer); g_api->Log(ELogLevel_INFO, "GolemHelper", startBuffer);
try { try {
@ -136,8 +144,23 @@ void AutomationLogic::ApplyAllBoons() {
continue; continue;
} }
int delay = (i == 19) ? 50 : g_state.stepDelay; if (i == 9) {
CoordinateUtils::ClickAtScaled(g_coords.boonStepX[i], g_coords.boonStepY[i], g_state.stepDelay);
if (g_state.showBoonAdvanced && g_state.addResistance) {
g_api->Log(ELogLevel_INFO, "GolemHelper", "Adding Resistance");
CoordinateUtils::ClickAtScaled(g_coords.resistanceX, g_coords.resistanceY, g_state.stepDelay);
}
if (g_state.showBoonAdvanced && g_state.addStability) {
g_api->Log(ELogLevel_INFO, "GolemHelper", "Adding Stability");
CoordinateUtils::ClickAtScaled(g_coords.stabilityX, g_coords.stabilityY, g_state.stepDelay);
}
continue;
}
int delay = (i == 19) ? 50 : g_state.stepDelay;
CoordinateUtils::ClickAtScaled(g_coords.boonStepX[i], g_coords.boonStepY[i], delay); CoordinateUtils::ClickAtScaled(g_coords.boonStepX[i], g_coords.boonStepY[i], delay);
} }
} }
@ -153,7 +176,7 @@ void AutomationLogic::ApplyAllBoons() {
} }
void AutomationLogic::ApplyGolemSettings() { void AutomationLogic::ApplyGolemSettings() {
if (!g_api || !g_state.golemEnabled || !g_state.enabled) return; if (!g_api || !g_state.enabled) return;
bool uiWasVisible = g_state.showUI; bool uiWasVisible = g_state.showUI;
if (uiWasVisible) { if (uiWasVisible) {

View file

@ -1,5 +1,7 @@
#pragma once #pragma once
#include "../Dependencies/mumble/mumble.h" #include "../Dependencies/mumble/mumble.h"
#include <vector>
#include <string>
enum HitboxType { enum HitboxType {
HITBOX_SMALL = 0, HITBOX_SMALL = 0,
@ -13,10 +15,38 @@ enum EnvironmentDamageLevel {
ENV_EXTREME = 2 ENV_EXTREME = 2
}; };
struct GolemTemplate {
std::string name;
bool isQuickDps;
bool isAlacDps;
bool environmentDamage;
EnvironmentDamageLevel envDamageLevel;
bool skipSlow;
bool skipBurning;
bool fiveBleedingStacks;
HitboxType hitboxType;
bool isDefaultTemplate;
bool addResistance;
bool addStability;
GolemTemplate() :
name("Unnamed Template"),
isQuickDps(false),
isAlacDps(false),
environmentDamage(false),
envDamageLevel(ENV_MILD),
skipSlow(false),
skipBurning(false),
fiveBleedingStacks(false),
hitboxType(HITBOX_SMALL),
isDefaultTemplate(false),
addResistance(false),
addStability(false) {
}
};
struct GolemHelperState { struct GolemHelperState {
bool enabled = false; bool enabled = false;
bool boonsEnabled = true;
bool golemEnabled = true;
bool isQuickDps = false; bool isQuickDps = false;
bool isAlacDps = false; bool isAlacDps = false;
bool environmentDamage = false; bool environmentDamage = false;
@ -29,6 +59,10 @@ struct GolemHelperState {
bool showUI = false; bool showUI = false;
bool showAdvanced = false; bool showAdvanced = false;
bool showTimingSettings = false; bool showTimingSettings = false;
bool showBoonAdvanced = false;
bool addResistance = false;
bool addStability = false;
bool alwaysHideIcon = false;
int debugCounter = 0; int debugCounter = 0;
int initialDelay = 390; int initialDelay = 390;
@ -36,6 +70,11 @@ struct GolemHelperState {
bool quickAccessVisible = false; bool quickAccessVisible = false;
unsigned int lastMapID = 0; unsigned int lastMapID = 0;
std::vector<GolemTemplate> templates;
int selectedTemplateIndex = -1;
int lastUserTemplateIndex = -1;
char newTemplateName[64] = "";
}; };
struct MenuCoordinates { struct MenuCoordinates {
@ -68,4 +107,9 @@ struct MenuCoordinates {
int healerStepY[10] = { int healerStepY[10] = {
262, 352, 352, 262, 262, 500, 450, 450, 305, 262 262, 352, 352, 262, 262, 500, 450, 450, 305, 262
}; };
int resistanceX = 830;
int resistanceY = 354;
int stabilityX = 830;
int stabilityY = 400;
}; };

View file

@ -21,12 +21,13 @@ void ConfigManager::SaveCustomDelaySettings() {
configFile << "[GolemHelper]" << std::endl; configFile << "[GolemHelper]" << std::endl;
configFile << "initialDelay=" << g_state.initialDelay << std::endl; configFile << "initialDelay=" << g_state.initialDelay << std::endl;
configFile << "stepDelay=" << g_state.stepDelay << std::endl; configFile << "stepDelay=" << g_state.stepDelay << std::endl;
configFile << "alwaysHideIcon=" << (g_state.alwaysHideIcon ? "1" : "0") << std::endl;
configFile.close(); configFile.close();
char logBuffer[250]; char logBuffer[300];
sprintf_s(logBuffer, "Delay settings saved: initialDelay=%dms, stepDelay=%dms", sprintf_s(logBuffer, "Settings saved: initialDelay=%dms, stepDelay=%dms, alwaysHideIcon=%s",
g_state.initialDelay, g_state.stepDelay); g_state.initialDelay, g_state.stepDelay, g_state.alwaysHideIcon ? "true" : "false");
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer); g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
} }
@ -69,13 +70,16 @@ void ConfigManager::LoadCustomDelaySettings() {
g_state.stepDelay = delay; g_state.stepDelay = delay;
} }
} }
else if (key == "alwaysHideIcon") {
g_state.alwaysHideIcon = (value == "1");
}
} }
configFile.close(); configFile.close();
char logBuffer[250]; char logBuffer[300];
sprintf_s(logBuffer, "Delay settings loaded: initialDelay=%dms, stepDelay=%dms", sprintf_s(logBuffer, "Settings loaded: initialDelay=%dms, stepDelay=%dms, alwaysHideIcon=%s",
g_state.initialDelay, g_state.stepDelay); g_state.initialDelay, g_state.stepDelay, g_state.alwaysHideIcon ? "true" : "false");
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer); g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
} }

View file

@ -0,0 +1,294 @@
#include <Windows.h>
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include "TemplateManager.h"
#include "../Common/Globals.h"
#include "../Utils/FileUtils.h"
void TemplateManager::LoadTemplates() {
if (!g_api) return;
CreateDefaultTemplates();
std::string templatePath = FileUtils::GetAddonPath() + "\\templates.cfg";
try {
std::ifstream file(templatePath);
if (!file.is_open()) {
g_api->Log(ELogLevel_INFO, "GolemHelper", "No user templates file found");
SaveTemplates();
return;
}
std::string line;
GolemTemplate currentTemplate;
bool inTemplate = false;
while (std::getline(file, line)) {
if (line.empty() || line[0] == '#') continue;
if (line.find("[Template]") == 0) {
if (inTemplate && !currentTemplate.name.empty()) {
g_state.templates.push_back(currentTemplate);
}
currentTemplate = GolemTemplate();
inTemplate = true;
continue;
}
if (!inTemplate) continue;
size_t equalPos = line.find('=');
if (equalPos == std::string::npos) continue;
std::string key = line.substr(0, equalPos);
std::string value = line.substr(equalPos + 1);
if (key == "name") {
currentTemplate.name = value;
}
else if (key == "isQuickDps") {
currentTemplate.isQuickDps = (value == "1");
}
else if (key == "isAlacDps") {
currentTemplate.isAlacDps = (value == "1");
}
else if (key == "environmentDamage") {
currentTemplate.environmentDamage = (value == "1");
}
else if (key == "envDamageLevel") {
currentTemplate.envDamageLevel = (EnvironmentDamageLevel)std::stoi(value);
}
else if (key == "skipSlow") {
currentTemplate.skipSlow = (value == "1");
}
else if (key == "skipBurning") {
currentTemplate.skipBurning = (value == "1");
}
else if (key == "fiveBleedingStacks") {
currentTemplate.fiveBleedingStacks = (value == "1");
}
else if (key == "hitboxType") {
currentTemplate.hitboxType = (HitboxType)std::stoi(value);
}
else if (key == "addResistance") {
currentTemplate.addResistance = (value == "1");
}
else if (key == "addStability") {
currentTemplate.addStability = (value == "1");
}
}
if (inTemplate && !currentTemplate.name.empty()) {
g_state.templates.push_back(currentTemplate);
}
file.close();
int userTemplateCount = 0;
for (const auto& temp : g_state.templates) {
if (!temp.isDefaultTemplate) userTemplateCount++;
}
char logBuffer[150];
sprintf_s(logBuffer, "Loaded %d user templates", userTemplateCount);
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
}
catch (...) {
g_api->Log(ELogLevel_WARNING, "GolemHelper", "Failed to load user templates");
}
}
void TemplateManager::SaveTemplates() {
if (!g_api) return;
std::string templatePath = FileUtils::GetAddonPath() + "\\templates.cfg";
try {
std::ofstream file(templatePath);
if (!file.is_open()) {
g_api->Log(ELogLevel_WARNING, "GolemHelper", "Could not create templates file");
return;
}
file << "# GolemHelper User Templates Configuration\n";
int savedCount = 0;
for (const auto& temp : g_state.templates) {
if (!temp.isDefaultTemplate) {
file << "[Template]\n";
file << "name=" << temp.name << "\n";
file << "isQuickDps=" << (temp.isQuickDps ? "1" : "0") << "\n";
file << "isAlacDps=" << (temp.isAlacDps ? "1" : "0") << "\n";
file << "environmentDamage=" << (temp.environmentDamage ? "1" : "0") << "\n";
file << "envDamageLevel=" << temp.envDamageLevel << "\n";
file << "skipSlow=" << (temp.skipSlow ? "1" : "0") << "\n";
file << "skipBurning=" << (temp.skipBurning ? "1" : "0") << "\n";
file << "fiveBleedingStacks=" << (temp.fiveBleedingStacks ? "1" : "0") << "\n";
file << "hitboxType=" << temp.hitboxType << "\n";
file << "addResistance=" << (temp.addResistance ? "1" : "0") << "\n";
file << "addStability=" << (temp.addStability ? "1" : "0") << "\n\n";
savedCount++;
}
}
file.close();
char logBuffer[150];
sprintf_s(logBuffer, "Saved %d user templates", savedCount);
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
}
catch (...) {
g_api->Log(ELogLevel_WARNING, "GolemHelper", "Failed to save templates");
}
}
void TemplateManager::SaveCurrentAsTemplate(const std::string& name) {
GolemTemplate newTemplate = CreateTemplateFromCurrentSettings();
newTemplate.name = name;
g_state.templates.push_back(newTemplate);
SaveTemplates();
if (g_api) {
char logBuffer[200];
sprintf_s(logBuffer, "Template '%s' saved successfully", name.c_str());
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
}
}
void TemplateManager::LoadTemplate(int index) {
if (index < 0 || index >= g_state.templates.size()) return;
ApplyTemplateToSettings(g_state.templates[index]);
if (!g_state.templates[index].isDefaultTemplate) {
g_state.selectedTemplateIndex = index;
g_state.lastUserTemplateIndex = index;
}
if (g_api) {
char logBuffer[200];
sprintf_s(logBuffer, "Template '%s' loaded", g_state.templates[index].name.c_str());
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
}
}
void TemplateManager::DeleteTemplate(int index) {
if (index < 0 || index >= g_state.templates.size()) return;
std::string templateName = g_state.templates[index].name;
g_state.templates.erase(g_state.templates.begin() + index);
if (g_state.selectedTemplateIndex == index) {
g_state.selectedTemplateIndex = -1;
}
else if (g_state.selectedTemplateIndex > index) {
g_state.selectedTemplateIndex--;
}
SaveTemplates();
if (g_api) {
char logBuffer[200];
sprintf_s(logBuffer, "Template '%s' deleted", templateName.c_str());
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
}
}
void TemplateManager::RenameTemplate(int index, const std::string& newName) {
if (index < 0 || index >= g_state.templates.size()) return;
std::string oldName = g_state.templates[index].name;
g_state.templates[index].name = newName;
SaveTemplates();
if (g_api) {
char logBuffer[300];
sprintf_s(logBuffer, "Template renamed from '%s' to '%s'", oldName.c_str(), newName.c_str());
g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer);
}
}
GolemTemplate TemplateManager::CreateTemplateFromCurrentSettings() {
GolemTemplate temp;
temp.isQuickDps = g_state.isQuickDps;
temp.isAlacDps = g_state.isAlacDps;
temp.environmentDamage = g_state.environmentDamage;
temp.envDamageLevel = g_state.envDamageLevel;
temp.skipSlow = g_state.skipSlow;
temp.skipBurning = g_state.skipBurning;
temp.fiveBleedingStacks = g_state.fiveBleedingStacks;
temp.hitboxType = g_state.hitboxType;
temp.addResistance = g_state.addResistance;
temp.addStability = g_state.addStability;
temp.isDefaultTemplate = false;
return temp;
}
void TemplateManager::ApplyTemplateToSettings(const GolemTemplate& temp) {
g_state.isQuickDps = temp.isQuickDps;
g_state.isAlacDps = temp.isAlacDps;
g_state.environmentDamage = temp.environmentDamage;
g_state.envDamageLevel = temp.envDamageLevel;
g_state.skipSlow = temp.skipSlow;
g_state.skipBurning = temp.skipBurning;
g_state.fiveBleedingStacks = temp.fiveBleedingStacks;
g_state.hitboxType = temp.hitboxType;
g_state.addResistance = temp.addResistance;
g_state.addStability = temp.addStability;
if (temp.isDefaultTemplate) {
g_state.showAdvanced = false;
g_state.showBoonAdvanced = false;
}
else {
if (temp.skipSlow || temp.skipBurning || temp.fiveBleedingStacks) {
g_state.showAdvanced = true;
}
if (temp.addResistance || temp.addStability) {
g_state.showBoonAdvanced = true;
}
}
}
void TemplateManager::CreateDefaultTemplates() {
g_state.templates.clear();
GolemTemplate dps;
dps.name = "DPS";
dps.isDefaultTemplate = true;
g_state.templates.push_back(dps);
GolemTemplate quickDps;
quickDps.name = "Quick DPS";
quickDps.isQuickDps = true;
quickDps.isDefaultTemplate = true;
g_state.templates.push_back(quickDps);
GolemTemplate alacDps;
alacDps.name = "Alac DPS";
alacDps.isAlacDps = true;
alacDps.isDefaultTemplate = true;
g_state.templates.push_back(alacDps);
GolemTemplate qHeal;
qHeal.name = "qHeal";
qHeal.isQuickDps = true;
qHeal.environmentDamage = true;
qHeal.envDamageLevel = ENV_MILD;
qHeal.isDefaultTemplate = true;
g_state.templates.push_back(qHeal);
GolemTemplate aHeal;
aHeal.name = "aHeal";
aHeal.isAlacDps = true;
aHeal.environmentDamage = true;
aHeal.envDamageLevel = ENV_MILD;
aHeal.isDefaultTemplate = true;
g_state.templates.push_back(aHeal);
}

View file

@ -0,0 +1,15 @@
#pragma once
#include "../Common/Types.h"
class TemplateManager {
public:
static void LoadTemplates();
static void SaveTemplates();
static void SaveCurrentAsTemplate(const std::string& name);
static void LoadTemplate(int index);
static void DeleteTemplate(int index);
static void RenameTemplate(int index, const std::string& newName);
static GolemTemplate CreateTemplateFromCurrentSettings();
static void ApplyTemplateToSettings(const GolemTemplate& temp);
static void CreateDefaultTemplates();
};

View file

@ -4,6 +4,7 @@
#include "Utils/FileUtils.h" #include "Utils/FileUtils.h"
#include "Utils/MapUtils.h" #include "Utils/MapUtils.h"
#include "Config/ConfigManager.h" #include "Config/ConfigManager.h"
#include "Config/TemplateManager.h"
#include "UI/UIManager.h" #include "UI/UIManager.h"
#include "Input/KeybindManager.h" #include "Input/KeybindManager.h"
#include "Dependencies/imgui/imgui.h" #include "Dependencies/imgui/imgui.h"
@ -21,6 +22,7 @@ void Load(AddonAPI* aApi) {
g_state.enabled = true; g_state.enabled = true;
ConfigManager::LoadCustomDelaySettings(); ConfigManager::LoadCustomDelaySettings();
TemplateManager::LoadTemplates();
FileUtils::CopyResourceIcons(); FileUtils::CopyResourceIcons();
g_api->Renderer.Register(ERenderType_Render, UIManager::RenderUI); g_api->Renderer.Register(ERenderType_Render, UIManager::RenderUI);
@ -33,7 +35,7 @@ void Load(AddonAPI* aApi) {
MapUtils::UpdateQuickAccessVisibility(); MapUtils::UpdateQuickAccessVisibility();
g_api->Log(ELogLevel_INFO, "GolemHelper", "=== GolemHelper v1.3.0.0 Loaded ==="); g_api->Log(ELogLevel_INFO, "GolemHelper", "=== GolemHelper v1.4.0.0 Loaded ===");
g_api->Log(ELogLevel_INFO, "GolemHelper", "<c=#00ff00>GolemHelper addon</c> loaded successfully!"); g_api->Log(ELogLevel_INFO, "GolemHelper", "<c=#00ff00>GolemHelper addon</c> loaded successfully!");
} }
@ -60,7 +62,7 @@ extern "C" __declspec(dllexport) AddonDefinition* GetAddonDef() {
def.Signature = -424248; def.Signature = -424248;
def.APIVersion = NEXUS_API_VERSION; def.APIVersion = NEXUS_API_VERSION;
def.Name = "GolemHelper"; def.Name = "GolemHelper";
def.Version = { 1, 3, 0, 0 }; def.Version = { 1, 4, 0, 0 };
def.Author = "Azrub"; def.Author = "Azrub";
def.Description = "Automates the process of setting optimal boon and golem configurations in the training area"; def.Description = "Automates the process of setting optimal boon and golem configurations in the training area";
def.Load = Load; def.Load = Load;

View file

@ -146,6 +146,7 @@
<ClInclude Include="Common\Globals.h" /> <ClInclude Include="Common\Globals.h" />
<ClInclude Include="Common\Types.h" /> <ClInclude Include="Common\Types.h" />
<ClInclude Include="Config\ConfigManager.h" /> <ClInclude Include="Config\ConfigManager.h" />
<ClInclude Include="Config\TemplateManager.h" />
<ClInclude Include="Dependencies\imgui\imconfig.h" /> <ClInclude Include="Dependencies\imgui\imconfig.h" />
<ClInclude Include="Dependencies\imgui\imgui.h" /> <ClInclude Include="Dependencies\imgui\imgui.h" />
<ClInclude Include="Dependencies\imgui\imgui_internal.h" /> <ClInclude Include="Dependencies\imgui\imgui_internal.h" />
@ -168,6 +169,7 @@
<ClCompile Include="Automation\CoordinateUtils.cpp" /> <ClCompile Include="Automation\CoordinateUtils.cpp" />
<ClCompile Include="Common\Globals.cpp" /> <ClCompile Include="Common\Globals.cpp" />
<ClCompile Include="Config\ConfigManager.cpp" /> <ClCompile Include="Config\ConfigManager.cpp" />
<ClCompile Include="Config\TemplateManager.cpp" />
<ClCompile Include="Dependencies\imgui\imgui.cpp"> <ClCompile Include="Dependencies\imgui\imgui.cpp">
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader> <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">NotUsing</PrecompiledHeader>

View file

@ -111,6 +111,9 @@
<ClInclude Include="Utils\MapUtils.h"> <ClInclude Include="Utils\MapUtils.h">
<Filter>Utils</Filter> <Filter>Utils</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="Config\TemplateManager.h">
<Filter>Config</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="dllmain.cpp"> <ClCompile Include="dllmain.cpp">
@ -161,6 +164,9 @@
<ClCompile Include="Utils\MapUtils.cpp"> <ClCompile Include="Utils\MapUtils.cpp">
<Filter>Utils</Filter> <Filter>Utils</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="Config\TemplateManager.cpp">
<Filter>Config</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ResourceCompile Include="GolemHelper.rc"> <ResourceCompile Include="GolemHelper.rc">

View file

@ -4,6 +4,7 @@
#include "../Common/Globals.h" #include "../Common/Globals.h"
#include "../Config/ConfigManager.h" #include "../Config/ConfigManager.h"
#include "../Utils/MapUtils.h" #include "../Utils/MapUtils.h"
#include "../Config/TemplateManager.h"
#include "../Dependencies/imgui/imgui.h" #include "../Dependencies/imgui/imgui.h"
void UIManager::RenderUI() { void UIManager::RenderUI() {
@ -11,32 +12,70 @@ void UIManager::RenderUI() {
if (!g_state.showUI) return; if (!g_state.showUI) return;
ImGui::SetNextWindowSize(ImVec2(400, 500), ImGuiCond_FirstUseEver); ImGui::SetNextWindowSize(ImVec2(450, 600), ImGuiCond_FirstUseEver);
ImGui::SetNextWindowPos(ImVec2(50, 50), ImGuiCond_FirstUseEver); ImGui::SetNextWindowPos(ImVec2(50, 50), ImGuiCond_FirstUseEver);
if (ImGui::Begin("GolemHelper", &g_state.showUI, ImGuiWindowFlags_AlwaysAutoResize)) { if (ImGui::Begin("GolemHelper", &g_state.showUI, ImGuiWindowFlags_AlwaysAutoResize)) {
ImGui::TextColored(ImVec4(0.2f, 0.8f, 1.0f, 1.0f), "GolemHelper v1.3.0.0"); ImGui::TextColored(ImVec4(0.2f, 0.8f, 1.0f, 1.0f), "GolemHelper v1.4.0.0");
ImGui::Separator(); ImGui::Separator();
ImGui::Text("Status:"); if (ImGui::BeginTabBar("GolemHelperTabs", ImGuiTabBarFlags_None)) {
if (ImGui::BeginTabItem("Settings")) {
RenderSettingsTab();
ImGui::EndTabItem();
}
if (ImGui::BeginTabItem("Templates")) {
ImGui::SameLine(); ImGui::SameLine();
if (g_state.enabled) { ImGui::SetCursorPosX(ImGui::GetWindowWidth() - 160);
ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f), "ENABLED");
std::string currentTemplateName = "None";
bool foundMatchingTemplate = false;
for (const auto& temp : g_state.templates) {
if (temp.isQuickDps == g_state.isQuickDps &&
temp.isAlacDps == g_state.isAlacDps &&
temp.environmentDamage == g_state.environmentDamage &&
temp.envDamageLevel == g_state.envDamageLevel &&
temp.skipSlow == g_state.skipSlow &&
temp.skipBurning == g_state.skipBurning &&
temp.fiveBleedingStacks == g_state.fiveBleedingStacks &&
temp.hitboxType == g_state.hitboxType &&
temp.addResistance == g_state.addResistance &&
temp.addStability == g_state.addStability) {
currentTemplateName = temp.name;
foundMatchingTemplate = true;
break;
}
}
ImGui::Text("Current: ");
ImGui::SameLine();
if (foundMatchingTemplate) {
if (currentTemplateName.length() > 12) {
currentTemplateName = currentTemplateName.substr(0, 9) + "...";
}
ImGui::TextColored(ImVec4(0.0f, 1.0f, 0.0f, 1.0f), "%s", currentTemplateName.c_str());
} }
else { else {
ImGui::TextColored(ImVec4(1.0f, 0.0f, 0.0f, 1.0f), "DISABLED"); ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "None");
} }
if (ImGui::Button(g_state.enabled ? "Disable GolemHelper" : "Enable GolemHelper", ImVec2(200, 0))) { RenderTemplatesTab();
g_state.enabled = !g_state.enabled; ImGui::EndTabItem();
} }
ImGui::Spacing(); ImGui::EndTabBar();
ImGui::Separator(); }
}
ImGui::End();
}
void UIManager::RenderSettingsTab() {
ImGui::Text("Boon Configuration"); ImGui::Text("Boon Configuration");
ImGui::Checkbox("Enable Boons", &g_state.boonsEnabled);
if (ImGui::Button("Apply Boons", ImVec2(150, 0))) { if (ImGui::Button("Apply Boons", ImVec2(150, 0))) {
if (g_state.enabled) { if (g_state.enabled) {
@ -68,6 +107,24 @@ void UIManager::RenderUI() {
g_state.isAlacDps = true; g_state.isAlacDps = true;
} }
ImGui::Spacing();
ImGui::Text("Advanced:");
if (g_state.environmentDamage) {
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.6f);
ImGui::Checkbox("Boon Settings", &g_state.showBoonAdvanced);
g_state.showBoonAdvanced = false;
ImGui::PopStyleVar();
}
else {
ImGui::Checkbox("Boon Settings", &g_state.showBoonAdvanced);
}
if (g_state.showBoonAdvanced && !g_state.environmentDamage) {
ImGui::Checkbox("Add Resistance", &g_state.addResistance);
ImGui::Checkbox("Add Stability", &g_state.addStability);
}
ImGui::Spacing(); ImGui::Spacing();
ImGui::Text("Healer Bench:"); ImGui::Text("Healer Bench:");
@ -98,7 +155,6 @@ void UIManager::RenderUI() {
ImGui::Separator(); ImGui::Separator();
ImGui::Text("Golem Configuration"); ImGui::Text("Golem Configuration");
ImGui::Checkbox("Enable Golem Settings", &g_state.golemEnabled);
if (ImGui::Button("Apply Golem Settings", ImVec2(150, 0))) { if (ImGui::Button("Apply Golem Settings", ImVec2(150, 0))) {
if (g_state.enabled) { if (g_state.enabled) {
@ -191,16 +247,168 @@ void UIManager::RenderUI() {
} }
} }
ImGui::PopStyleColor(2); ImGui::PopStyleColor(2);
}
void UIManager::RenderTemplatesTab() {
ImGui::Text("Template Management");
ImGui::Separator();
ImGui::Text("Save Current Settings:");
ImGui::SetNextItemWidth(200);
ImGui::InputText("##templateName", g_state.newTemplateName, sizeof(g_state.newTemplateName));
ImGui::SameLine();
if (ImGui::Button("Save Template")) {
if (strlen(g_state.newTemplateName) > 0) {
TemplateManager::SaveCurrentAsTemplate(std::string(g_state.newTemplateName));
memset(g_state.newTemplateName, 0, sizeof(g_state.newTemplateName));
}
} }
ImGui::End(); ImGui::Spacing();
ImGui::Separator();
ImGui::Text("Available Templates:");
std::vector<int> userTemplateIndices;
std::vector<const char*> userTemplateNames;
for (int i = 0; i < g_state.templates.size(); i++) {
if (!g_state.templates[i].isDefaultTemplate) {
userTemplateIndices.push_back(i);
userTemplateNames.push_back(g_state.templates[i].name.c_str());
}
}
if (userTemplateNames.empty()) {
ImGui::TextColored(ImVec4(0.7f, 0.7f, 0.7f, 1.0f), "No user templates saved");
}
else {
int currentUserIndex = -1;
if (g_state.lastUserTemplateIndex >= 0) {
for (int i = 0; i < userTemplateIndices.size(); i++) {
if (userTemplateIndices[i] == g_state.lastUserTemplateIndex) {
currentUserIndex = i;
break;
}
}
}
ImGui::SetNextItemWidth(200);
if (ImGui::Combo("##templateList", &currentUserIndex, userTemplateNames.data(), userTemplateNames.size())) {
g_state.selectedTemplateIndex = userTemplateIndices[currentUserIndex];
g_state.lastUserTemplateIndex = userTemplateIndices[currentUserIndex];
}
ImGui::SameLine();
if (ImGui::Button("Load")) {
if (currentUserIndex >= 0 && currentUserIndex < userTemplateIndices.size()) {
TemplateManager::LoadTemplate(userTemplateIndices[currentUserIndex]);
}
}
ImGui::SameLine();
if (ImGui::Button("Delete")) {
if (currentUserIndex >= 0 && currentUserIndex < userTemplateIndices.size()) {
TemplateManager::DeleteTemplate(userTemplateIndices[currentUserIndex]);
g_state.selectedTemplateIndex = -1;
}
}
if (g_state.lastUserTemplateIndex >= 0 &&
g_state.lastUserTemplateIndex < g_state.templates.size()) {
const auto& selectedTemplate = g_state.templates[g_state.lastUserTemplateIndex];
ImGui::Spacing();
ImGui::Separator();
ImGui::Text("%s", selectedTemplate.name.c_str());
std::string modeText = "Normal";
if (selectedTemplate.isQuickDps) modeText = "Quick DPS";
else if (selectedTemplate.isAlacDps) modeText = "Alac DPS";
if (selectedTemplate.environmentDamage) {
modeText += " + Env ";
switch (selectedTemplate.envDamageLevel) {
case ENV_MILD: modeText += "Mild"; break;
case ENV_MODERATE: modeText += "Moderate"; break;
case ENV_EXTREME: modeText += "Extreme"; break;
}
}
ImGui::Text("Mode: %s", modeText.c_str());
const char* hitboxName = selectedTemplate.hitboxType == HITBOX_SMALL ? "Small" :
selectedTemplate.hitboxType == HITBOX_MEDIUM ? "Medium" : "Large";
ImGui::Text("Hitbox: %s", hitboxName);
if (selectedTemplate.skipSlow || selectedTemplate.skipBurning || selectedTemplate.fiveBleedingStacks) {
std::string conditions;
if (selectedTemplate.skipSlow) conditions += "Skip Slow, ";
if (selectedTemplate.skipBurning) conditions += "Skip Burning, ";
if (selectedTemplate.fiveBleedingStacks) conditions += "5 Bleeding, ";
if (!conditions.empty()) {
conditions.pop_back();
conditions.pop_back();
}
ImGui::Text("Conditions: %s", conditions.c_str());
}
if (selectedTemplate.addResistance || selectedTemplate.addStability) {
std::string boonSettings;
if (selectedTemplate.addResistance) boonSettings += "Resistance, ";
if (selectedTemplate.addStability) boonSettings += "Stability, ";
if (!boonSettings.empty()) {
boonSettings.pop_back();
boonSettings.pop_back();
}
ImGui::Text("Boon Settings: %s", boonSettings.c_str());
}
}
}
ImGui::Spacing();
ImGui::Separator();
ImGui::Text("Quick Load:");
std::vector<std::string> defaultNames = { "DPS", "Quick DPS", "Alac DPS", "qHeal", "aHeal" };
for (const std::string& name : defaultNames) {
int templateIndex = -1;
for (int i = 0; i < g_state.templates.size(); i++) {
if (g_state.templates[i].name == name && g_state.templates[i].isDefaultTemplate) {
templateIndex = i;
break;
}
}
if (templateIndex >= 0) {
if (ImGui::Button(name.c_str(), ImVec2(80, 0))) {
TemplateManager::LoadTemplate(templateIndex);
g_state.selectedTemplateIndex = -1;
}
if (name != "Alac DPS" && name != "aHeal") {
ImGui::SameLine();
}
}
}
} }
void UIManager::RenderOptions() { void UIManager::RenderOptions() {
ImGui::Separator(); ImGui::Separator();
ImGui::Text("GolemHelper Settings"); ImGui::Text("GolemHelper Settings");
ImGui::Checkbox("Show UI by default", &g_state.showUI); bool oldAlwaysHideIcon = g_state.alwaysHideIcon;
ImGui::Checkbox("Always Hide Icon", &g_state.alwaysHideIcon);
if (oldAlwaysHideIcon != g_state.alwaysHideIcon) {
ConfigManager::SaveCustomDelaySettings();
MapUtils::UpdateQuickAccessVisibility();
}
ImGui::Checkbox("Enable debug mode", &g_state.debugMode); ImGui::Checkbox("Enable debug mode", &g_state.debugMode);
if (ImGui::Button("Reset all settings")) { if (ImGui::Button("Reset all settings")) {
@ -214,12 +422,15 @@ void UIManager::RenderOptions() {
g_state.hitboxType = HITBOX_SMALL; g_state.hitboxType = HITBOX_SMALL;
g_state.showAdvanced = false; g_state.showAdvanced = false;
g_state.showTimingSettings = false; g_state.showTimingSettings = false;
g_state.showBoonAdvanced = false;
g_state.addResistance = false;
g_state.addStability = false;
g_state.stepDelay = 290; g_state.stepDelay = 290;
g_state.initialDelay = 390; g_state.initialDelay = 390;
g_state.boonsEnabled = true; g_state.alwaysHideIcon = false;
g_state.golemEnabled = true;
ConfigManager::SaveCustomDelaySettings(); ConfigManager::SaveCustomDelaySettings();
MapUtils::UpdateQuickAccessVisibility();
} }
ImGui::Spacing(); ImGui::Spacing();
@ -260,4 +471,9 @@ void UIManager::RenderOptions() {
ImGui::Text("- Step Delay: %d ms", g_state.stepDelay); ImGui::Text("- Step Delay: %d ms", g_state.stepDelay);
ImGui::Text("- Initial Delay: %d ms", g_state.initialDelay); ImGui::Text("- Initial Delay: %d ms", g_state.initialDelay);
ImGui::Text("- Templates: %zu loaded", g_state.templates.size());
if (g_state.selectedTemplateIndex >= 0 && g_state.selectedTemplateIndex < g_state.templates.size()) {
ImGui::Text("- Active Template: %s", g_state.templates[g_state.selectedTemplateIndex].name.c_str());
}
} }

View file

@ -4,4 +4,8 @@ class UIManager {
public: public:
static void RenderUI(); static void RenderUI();
static void RenderOptions(); static void RenderOptions();
private:
static void RenderSettingsTab();
static void RenderTemplatesTab();
}; };

View file

@ -1,7 +1,4 @@
#include <Windows.h> #include <Windows.h>
#include <string>
#include <sstream>
#include <iostream>
#include "MapUtils.h" #include "MapUtils.h"
#include "../Common/Globals.h" #include "../Common/Globals.h"
@ -20,10 +17,10 @@ unsigned int MapUtils::GetCurrentMapID() {
void MapUtils::UpdateQuickAccessVisibility() { void MapUtils::UpdateQuickAccessVisibility() {
if (!g_api) return; if (!g_api) return;
bool shouldBeVisible = IsInTrainingArea(); bool shouldBeVisible = IsInTrainingArea() && !g_state.alwaysHideIcon;
unsigned int currentMapID = GetCurrentMapID(); unsigned int currentMapID = GetCurrentMapID();
if (currentMapID != g_state.lastMapID) { if (currentMapID != g_state.lastMapID || g_state.quickAccessVisible != shouldBeVisible) {
g_state.lastMapID = currentMapID; g_state.lastMapID = currentMapID;
if (shouldBeVisible && !g_state.quickAccessVisible) { if (shouldBeVisible && !g_state.quickAccessVisible) {
@ -42,13 +39,14 @@ void MapUtils::UpdateQuickAccessVisibility() {
g_api->Log(ELogLevel_INFO, "GolemHelper", buffer); g_api->Log(ELogLevel_INFO, "GolemHelper", buffer);
} }
} }
else if (!shouldBeVisible && g_state.quickAccessVisible) { else if ((!shouldBeVisible || g_state.alwaysHideIcon) && g_state.quickAccessVisible) {
g_api->QuickAccess.Remove("GolemHelper.ToggleUI"); g_api->QuickAccess.Remove("GolemHelper.ToggleUI");
g_state.quickAccessVisible = false; g_state.quickAccessVisible = false;
if (g_state.debugMode) { if (g_state.debugMode) {
char buffer[150]; const char* reason = g_state.alwaysHideIcon ? "Always Hide Icon enabled" : "Not Training Area";
sprintf_s(buffer, sizeof(buffer), "QuickAccess icon REMOVED - MapID: %u (Not Training Area)", currentMapID); char buffer[200];
sprintf_s(buffer, sizeof(buffer), "QuickAccess icon REMOVED - MapID: %u (%s)", currentMapID, reason);
g_api->Log(ELogLevel_INFO, "GolemHelper", buffer); g_api->Log(ELogLevel_INFO, "GolemHelper", buffer);
} }
} }