From f41ab403560f3fe080a467881d5440a54b3f6d6b Mon Sep 17 00:00:00 2001 From: Azrub Date: Wed, 16 Jul 2025 18:57:20 +0200 Subject: [PATCH] Release 1.2.2.0 - Added embedded icons support with Windows resources - Added icon extraction from embedded DLL resources - Include PNG icons as embedded resources - Updated gitignore for build artifacts - Icons are automatically extracted to addons/GolemHelper/icons/ --- .gitignore | 57 +++++++++++- GolemHelper/GolemHelper.rc | Bin 0 -> 3246 bytes GolemHelper/GolemHelper.vcxproj | 8 ++ GolemHelper/GolemHelper.vcxproj.filters | 11 +++ GolemHelper/Resources/GOLEM_HELPER_ICON.png | Bin 0 -> 1454 bytes .../Resources/GOLEM_HELPER_ICON_HOVER.png | Bin 0 -> 1738 bytes GolemHelper/dllmain.cpp | 87 ++++++++++++++++-- GolemHelper/resource.h | 17 ++++ 8 files changed, 169 insertions(+), 11 deletions(-) create mode 100644 GolemHelper/GolemHelper.rc create mode 100644 GolemHelper/Resources/GOLEM_HELPER_ICON.png create mode 100644 GolemHelper/Resources/GOLEM_HELPER_ICON_HOVER.png create mode 100644 GolemHelper/resource.h diff --git a/.gitignore b/.gitignore index a5eec74..1dd6bcf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,43 @@ # Prerequisites *.d + # Compiled Object files *.slo *.lo *.o *.obj + # Precompiled Headers *.gch *.pch + # Linker files *.ilk + # Debugger Files *.pdb + # Compiled Dynamic libraries *.so *.dylib *.dll + # Fortran module files *.mod *.smod + # Compiled Static libraries *.lai *.la *.a *.lib + # Executables *.exe *.out *.app -# debug information files + +# Debug information files *.dwo # Visual Studio specific files @@ -45,6 +54,16 @@ *.svclog *.scc +# Visual Studio additional files +*.vcxproj.user +*.vcxproj.filters +*.sdf +*.opensdf +*.db +*.opendb +*.idb +*.exp + # Build folders [Dd]ebug/ [Dd]ebugPublic/ @@ -67,4 +86,38 @@ bld/ *.command.* *.read.* *.write.* -link-* \ No newline at end of file +link-* + +# Backup files +*.bak +*~ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Temporary files +*.tmp +*.temp + +# IDE files +*.swp +*.swo + +# Package files (vcpkg, NuGet) +packages/ +vcpkg_installed/ + +# Visual Studio Code +.vscode/ + +# JetBrains IDEs +.idea/ + +# Resource compiled files +*.aps \ No newline at end of file diff --git a/GolemHelper/GolemHelper.rc b/GolemHelper/GolemHelper.rc new file mode 100644 index 0000000000000000000000000000000000000000..1d2667e131d17294479313848a6e816ab9d2abaf GIT binary patch literal 3246 zcmdUy+iuf95QhJ2B;LU!H?2So&?jgT6C&KSYLW`1ND*pqiB!@m2XVu*1K;ejV8;hU zkdV>J-t~BPcMkvjUVr=AQAd%^wbYH)y4Qv))fU+`vW<3nuRET4dP<9Qs}EXnt&wl( z7s%H1HgCu1hH=D`t+vzyIwyLpN9@vZeH-bDw|8hSoNlWy|3n|va@sbt?etPN&(=QE zrN)|Qs=kK0&|FuFk@gvnl;|CjG52$IktB@6{$@k-TCgtkkp{$NKgKChy4NTC-x3{* z!vwG2av$P#4?is)G4hvO`x*It4nDj1`g!^IH!otrB9D$8u`(p3_HO}-3B>6fTQ!`U4st195#a_=q2cz&NJ2?qt|6OKWAUVqTuswUR3AXs^JtaO|1>mz7l(ogQe>pYGFk?7M&ujZu6vMkr&KBHBWZn#CbmYqDtaeqECJ z!OvO=9t=T4mx}gp4RiI)>(%RI-?m_k{JCKR9%fi#U+tLh_gt^(6D)|)HAd+1Zp4Y= z0o>eX&Ioy14ZHR2-`Q$DT);@?LDBANtR2qv*<3ek9FP@ys_p`W_gsgrdU^h icaAf@t3StuIA*PA*4Qkp#<-nf>`$Y3YAfd5R{9Q)S9Co9 literal 0 HcmV?d00001 diff --git a/GolemHelper/GolemHelper.vcxproj b/GolemHelper/GolemHelper.vcxproj index 017a68e..8fecd22 100644 --- a/GolemHelper/GolemHelper.vcxproj +++ b/GolemHelper/GolemHelper.vcxproj @@ -151,6 +151,7 @@ + @@ -196,6 +197,13 @@ Create + + + + + + + diff --git a/GolemHelper/GolemHelper.vcxproj.filters b/GolemHelper/GolemHelper.vcxproj.filters index cdf6328..3b02c57 100644 --- a/GolemHelper/GolemHelper.vcxproj.filters +++ b/GolemHelper/GolemHelper.vcxproj.filters @@ -25,6 +25,9 @@ {9474c716-f028-4778-8cd0-b5d8292d1586} + + {07fb10f3-1f9b-483c-8721-e22bfe687792} + @@ -81,4 +84,12 @@ Dependencies\imgui + + + Resources + + + Resources + + \ No newline at end of file diff --git a/GolemHelper/Resources/GOLEM_HELPER_ICON.png b/GolemHelper/Resources/GOLEM_HELPER_ICON.png new file mode 100644 index 0000000000000000000000000000000000000000..212a85f787d796a92ce9fc1da6e0c3a3acf7326d GIT binary patch literal 1454 zcmV;f1yTBmP)wk1Jk?3{{c{Rh1=T ziUl-Y20Ca8RFeo*m2=YT1VnrrU5yD=mI+psf{$+h{|^{kklnpcCu52yVu`1sU z2ugzmL3V4%;|NcRXvX2q(SK^k;%Ua>iIr{&R+XThW45AE2~my+O^5|ET?I5=1TiIZz%gnnzs<7vg=n)LsL*XzBlT7-~o zXM1QSV~eHf_J_~qDsrbkhO{3Q~{-LUw7!;t5WPX~yCKGhk}Q;%dg?0yAKpon)MxWo^pjWPo>T#^Pv# zbzXgWh1cv|e0gca--FBJY{=uZsa$T$PqoRYPB6 zXMuGHR+eOeb}wg#UVV30dU{B6fCW^SLU4h4i*HeOdk9X713763Q<7b7Tq0qOOKNXD zZi6>nZ8278qMu?+bbJt5lLknEOOm^Je_2v{gL8jiV0mplg|sVKazt!=mCV{$eurao zU*7rjv*GAgXj&OYW~a}&Bu{Flw~d03Y+Hz#T8Nl!rMzmQxv9XIslS(%rht~FezT}u zw5VOlm;THE00512QchCMfwd_Z3A^S6*P{7RcXt^u7{lFR?(S~s?X7!@yAS5_r|q^p zuok|OFOl=hljJ=o0GwW)i*E%0&#L4lL7fhAIh8C*2oQVroWH{- z)#$}<(e^k1st|fnegMcT zC@H%Q08u?b*ZWY^hten1L;&uTl@#O!fUKNb#r|4wc~d6T=R-|XJg&b6#n*GP0zhUq zKi8i`M8ng%Ef%+yr$NH7g6KB(TB_jX(SPEpb$g6tqREFj8$pi+T;C9=>!Jn=Db6|?rFK$xjX_Sp*D zaUGv#wMt?F`-m|Tt2OOdZUH&|{s2>8HS_BO{`vs^_y7?*dH?n@#FxpzmLqr0TDoe{qX?B&x;m9ef{wOqM;aiCp(i>|L=7iQsIN7Wp-l)idW@V;1~GMlluneIDhflHS!qPMvK~oYMw6sd z2s?>FSx=;^H=U|Vm!?jpp$j}tJbQKtEJjd7R62Ni9bINAVRcR|Rd|Yx9S1gkV{b8< zlm-wnTT59ov$ZmEjA)&l7YsLbmX#ASNl6GSW{#gzh?G8?q(5tZR%Uus5;$uUDn&p} zG#EN!kfKuvFKY)lgBd<-dXZ#AVPiE-PlAXiY-$c2CLfoqSYCp48dRbqFDDH!XD4B< zB|uPab|x}EGQqo6lb=I5Raq}iUqW17aDYh%J(0MtPQSKRwXQ`VHbVdZ_w(}5(|v8@nKXk37lUW&5iEtz3Jw& zv#KONQb;^mZIX@%DMnQ0RKBA0001abW%=J00s>M z5*hvi79RcyBZAj3LS0r)t|R`XEzIIldk}?b{_f}0&+IuTzMqENrJelgPaXI4@|ymP zj?lrgkHL1E{i$MYqxWdjtIoLe)pd==y+V2A*#7qUl-xMs?C#oQz^I(zv!c$_^pEnK znBL^t?wU6XPMuota$#fbGS9FvpT9PceX5^YJn8Yo^xkSe==)EU4i!L!`eAtXKa61 zxn!;_!Yk@ZQ|9lOJncl6cXpn3u6NhtX%BYH-^RxQS7681esYqDacggrhfJZz?5S`LHy>#{_d;GmtWn`u;ivLgFx9_y=(d)XL3qi+Bjd1okeo<#XB_< zu3z7o#8UVFfDSQJS~bRe(WVYSq?tKWip*Z&|c->uM=Z24S}Pd66Im z9DEm5#W@%R!f*e+TiMy)e~0bvzuOgR45C(gk0fQmzKD(oCUUpXTfh3kf-heV4r};( zD-;-tOmeD_2xZ~~rSZ(KtN;A)2@D7@kov!MRWB%vxOtFL9=FE(`i<)~7+F}DB-bpf zKZ}+z7#M_%_ARSlstXEvksI~P_9+UW%Cp;7nz1Qbfkma270sqr%AuJcDlI6?&jd|B gQ9^>khQwxi06obNA=(?4@&Et;07*qoM6N<$f_REPh5!Hn literal 0 HcmV?d00001 diff --git a/GolemHelper/dllmain.cpp b/GolemHelper/dllmain.cpp index 6d0975a..cbf8fde 100644 --- a/GolemHelper/dllmain.cpp +++ b/GolemHelper/dllmain.cpp @@ -8,6 +8,7 @@ #include "Dependencies/imgui/imgui.h" #include "Dependencies/nexus/Nexus.h" #include "Dependencies/mumble/Mumble.h" +#include "resource.h" AddonAPI* g_api = nullptr; NexusLinkData* NexusLink = nullptr; @@ -91,10 +92,11 @@ void HandleUIToggleKeybind(const char* id, bool release); void HandleDebugKeybind(const char* id, bool release); void SaveCustomDelaySettings(); void LoadCustomDelaySettings(); +void CopyResourceIcons(); void Load(AddonAPI* aApi); void Unload(); -std::string GetConfigFilePath() { +std::string GetAddonPath() { char gameDir[MAX_PATH]; GetModuleFileNameA(NULL, gameDir, MAX_PATH); @@ -107,7 +109,11 @@ std::string GetConfigFilePath() { std::string addonPath = gamePath + "\\addons\\GolemHelper"; CreateDirectoryA(addonPath.c_str(), NULL); - std::string configPath = addonPath + "\\config.ini"; + return addonPath; +} + +std::string GetConfigFilePath() { + std::string configPath = GetAddonPath() + "\\config.ini"; if (g_api) { char logBuffer[500]; @@ -118,6 +124,69 @@ std::string GetConfigFilePath() { return configPath; } +bool ExtractResourceToFile(HMODULE hModule, int resourceID, const std::string& filePath) { + HRSRC hRes = FindResourceA(hModule, MAKEINTRESOURCEA(resourceID), "PNG"); + if (!hRes) return false; + + HGLOBAL hData = LoadResource(hModule, hRes); + if (!hData) return false; + + LPVOID pData = LockResource(hData); + if (!pData) return false; + + DWORD dataSize = SizeofResource(hModule, hRes); + if (!dataSize) return false; + + std::ofstream file(filePath, std::ios::binary); + if (!file.is_open()) return false; + + file.write(static_cast(pData), dataSize); + file.close(); + + return true; +} + +void CopyResourceIcons() { + if (!g_api) return; + + std::string addonPath = GetAddonPath(); + std::string iconsPath = addonPath + "\\icons"; + CreateDirectoryA(iconsPath.c_str(), NULL); + + std::string iconDestPath = iconsPath + "\\GOLEM_HELPER_ICON.png"; + std::string iconHoverDestPath = iconsPath + "\\GOLEM_HELPER_ICON_HOVER.png"; + + if (GetFileAttributesA(iconDestPath.c_str()) != INVALID_FILE_ATTRIBUTES && + GetFileAttributesA(iconHoverDestPath.c_str()) != INVALID_FILE_ATTRIBUTES) { + g_api->Log(ELogLevel_INFO, "GolemHelper", "Icons already exist, skipping unpack"); + return; + } + + HMODULE hModule = GetModuleHandleA("GolemHelper.dll"); + if (!hModule) { + g_api->Log(ELogLevel_WARNING, "GolemHelper", "Failed to get module handle"); + return; + } + + if (ExtractResourceToFile(hModule, IDB_PNG1, iconDestPath)) { + char logBuffer[300]; + sprintf_s(logBuffer, "Extracted icon from resources: %s", iconDestPath.c_str()); + g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer); + } + else { + g_api->Log(ELogLevel_WARNING, "GolemHelper", "Failed to extract normal icon from resources"); + } + + if (ExtractResourceToFile(hModule, IDB_PNG2, iconHoverDestPath)) { + char logBuffer[300]; + sprintf_s(logBuffer, "Extracted hover icon from resources: %s", iconHoverDestPath.c_str()); + g_api->Log(ELogLevel_INFO, "GolemHelper", logBuffer); + } + else { + g_api->Log(ELogLevel_WARNING, "GolemHelper", "Failed to extract hover icon from resources"); + } +} + void SaveCustomDelaySettings() { if (!g_api) return; @@ -201,7 +270,7 @@ void RenderUI() { if (ImGui::Begin("GolemHelper", &g_state.showUI, ImGuiWindowFlags_AlwaysAutoResize)) { - ImGui::TextColored(ImVec4(0.2f, 0.8f, 1.0f, 1.0f), "GolemHelper v1.2.1.0"); + ImGui::TextColored(ImVec4(0.2f, 0.8f, 1.0f, 1.0f), "GolemHelper v1.2.2.0"); ImGui::Separator(); ImGui::Text("Status:"); @@ -826,6 +895,8 @@ void Load(AddonAPI* aApi) { LoadCustomDelaySettings(); + CopyResourceIcons(); + g_api->Renderer.Register(ERenderType_Render, RenderUI); g_api->Renderer.Register(ERenderType_OptionsRender, RenderOptions); @@ -838,10 +909,8 @@ void Load(AddonAPI* aApi) { g_api->InputBinds.RegisterWithStruct("GolemHelper.ToggleUI", HandleUIToggleKeybind, kb_empty); g_api->InputBinds.RegisterWithStruct("GolemHelper.DebugMouse", HandleDebugKeybind, kb_empty); - /* COMMENTO IN ATTESA DI CUSTOM ICON - g_api->Textures.GetOrCreateFromFile("GOLEM_HELPER_ICON", "addons/GolemHelper/GOLEM_HELPER_ICON.png"); - g_api->Textures.GetOrCreateFromFile("GOLEM_HELPER_ICON_HOVER", "addons/GolemHelper/GOLEM_HELPER_ICON_HOVER.png"); - */ + g_api->Textures.GetOrCreateFromFile("GOLEM_HELPER_ICON", "addons/GolemHelper/icons/GOLEM_HELPER_ICON.png"); + g_api->Textures.GetOrCreateFromFile("GOLEM_HELPER_ICON_HOVER", "addons/GolemHelper/icons/GOLEM_HELPER_ICON_HOVER.png"); g_api->QuickAccess.Add( "GolemHelper.ToggleUI", @@ -851,7 +920,7 @@ void Load(AddonAPI* aApi) { "Toggle GolemHelper UI" ); - g_api->Log(ELogLevel_INFO, "GolemHelper", "=== GolemHelper v1.2.1.0 Loaded ==="); + g_api->Log(ELogLevel_INFO, "GolemHelper", "=== GolemHelper v1.2.2.0 Loaded ==="); g_api->Log(ELogLevel_INFO, "GolemHelper", "GolemHelper addon loaded successfully!"); } @@ -880,7 +949,7 @@ extern "C" __declspec(dllexport) AddonDefinition* GetAddonDef() { def.Signature = -424248; def.APIVersion = NEXUS_API_VERSION; def.Name = "GolemHelper"; - def.Version = { 1, 2, 1, 0 }; + def.Version = { 1, 2, 2, 0 }; def.Author = "Azrub"; def.Description = "Automates the process of setting optimal boon and golem configurations in the training area"; def.Load = Load; diff --git a/GolemHelper/resource.h b/GolemHelper/resource.h new file mode 100644 index 0000000..efee13e --- /dev/null +++ b/GolemHelper/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// File di inclusione generato con Microsoft Visual C++. +// Utilizzato da GolemHelper.rc +// +#define IDB_PNG1 104 +#define IDB_PNG2 105 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 106 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif